home · blog · groups · about us · contact us
DevelopmentNow Blog
 Thursday, June 21, 2007
 
 

List-y blog post today. Thx to John, Maddog, and other commenters at TechCrunch for some of the links.

And then I'll just add a lower-end turnkey, hosted Ning-esque option

Update: added Group Members International & YFonGlobal

June 21, 2007    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Wednesday, June 20, 2007
 
 
TechCrunch had a mini-review today about KickApps, a turnkey social networking service/platform that offers widgets, SNS hosting, and an open API.
June 20, 2007    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Saturday, June 02, 2007
 
 

The A-lister for dedicated servers is Rackspace, a managed hosting provider I'm always happy to recommend. Great support & service. The one "downside" is that their price reflects their quality.

For cheaper dedicated boxes, you have to sift through hundreds of hosting companies and try to find ones who meet your needs, aren't going to screw up, and support you to the level needed. Sometimes you don't need a lot of support or uptime, and so you can get away with a cheaper box. I read some good things about ServerBeach and LayeredTech -- they seem to be a popular choice for inexpensive dedicated machines.

June 2, 2007    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Thursday, May 31, 2007
 
 

A few interesting links on time and working:

I like the 1 hour solution bit ... I already time all my tasks with a project timer I wrote, but sometimes I get a tired during the day and find myself tempted to check up on forums that I like, check email accounts I don't use very often, check RSS feeds, etc. So treating those as a reward might help me avoid doing them.

Granted, I wouldn't have found the above posts if I didn't check RSS feeds, but hey ... I can appreciate irony.

May 31, 2007    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 
 
I wanted to write a little bit on effective IT hiring techniques. But today's a busy day, so instead of a massive essay called "Strategies for Effective Hiring" you just get a Cliffs notes Jank Handy thought list. Which is probably ok since you don't have time to read a giant hiring guide. If you want a big guide, read Joel Spolsky's Guerrilla Guide to Interviewing. It has a lot of good suggestions. Ok, moving on.

Finding Candidates

There's a lot of advice on finding good candidates, and I don't have a magic, easy answer. I will say that good candidates sometimes have to be lured and convinced to join your company. Eons ago, a startup I worked for was able to eventually convince a really good DBA to come work for the company. The IT manager had worked with this guy before & knew he'd be a great asset to the company. Initially our attempts to convince the database superhero failed, as he had a nice contracting gig that he didn't want to give up. But, we didn't give up. After several months of subtle and non-annoying wooing, he finally came on board. Granted, the defining moment was when the future coworker was told by his consulting company that he'd have to start travelling or commuting more. He then contacted us and said, "Hey, tell me again about your new startup, I think I might be interested."

So does that mean you should bribe consulting companies to send their top programmers on crappy travel assignments? No. But it means a few things:
  • Good candidates aren't just lurking on Monster.com, CraigsList, and other resume databases. You should ask around, tap your network, and try to come up with a list of good people that you can contact and see what their situation is.
  • If a person isn't available, don't give up. But don't annoy them, either. :) Listen to them, and just follow up in a friendly way from time to time, letting them know how the company is doing, telling them that if their situation changes, feel free to look you up, etc. This is a basic tenet of standard networking anyhow -- keeping in touch with worthwhile people. If you used to be a programmer, you may not be into (people) networking. But you should try to change that, if you can.
  • Be in a position to consider great candidates, and try to be a place where people might be interested in working. You never know when a good candidate will appear, so ask yourself, "If I were working somewhere else and wanting to make a move, would I want to work here?" If the answer is "no", you have a problem.

Interview Effectively

I could write a lot this, but I'll try to keep it short for now. Joel's aforementioned article has a lot of good interview tips, but I'll add my own.

Multi-level interview process

Have a multi-level interview process so that you don't spend a ton of time on candidates that aren't a good fit. The levels act as a filtering mechanism, so candidates who don't pass a level get rejected and don't continue to the other levels. 

For me, the first level was often handled by recruiters -- an in-person discussion and some technical screening questions. That filtered out 80-90% of the candidates, so that probably saved me 10-20 hours a week. Well worth the recruiter fee. If you aren't using recruiters, that's ok -- you'll probably just start with a phone screen.

Next would be a phone screen where I would ask a series of questions, talk a bit about the company, and learn more about the candidate. Phone screens were mostly technical questions, and if a candidate was doing terribly halfway through, I would usually not ask the rest of the questions and wrap up the phone screen. If you know someone's a "no," don't spend another 30 minutes. And if you hear a long pause and some clicking after you ask a tough question, you know they're looking up the answer. :) Phone screens probably filtered out another 75% of candidates.

After a successful phone screen, I'd invite candidates to come into the office. I would tell them to plan on being there 2-3 hours. The candidate would come in and meet with me for a bit, and then take a 1-2 hour written aptitude exam. I'd have them wait in the meeting room while I looked through the exam to see if they did well enough. 

If they passed the exam, I'd have them meet with several members of the existing team for 30-60 minutes.

BTW, some people prefer to do the initial screen in person, but I don't, and here's why: 

I went back & forth about meeting people in person vs phone calls for the initial technical screen. An in person meeting will give you more information about whether the person is a good fit, and eliminate the chance of them cheating during a phone screen. However, many of my phone screens ended after 15-20 minutes when it was apparent that they didn't have the knowledge we were looking for. I didn't want to invite people into the office and then send them away after 20 minutes (it seemed rude to me for some reason), and I certainly didn't want to conduct hour-long in person interviews with people that I could evaluate in 20 minutes over the phone.

Technical Screens

For technical screens (both in-person and over the phone), try to ask some open ended questions. Technical questions are good, but avoid obscure ones that even great programmers might not know but that can be easily looked up online or in a book. Ask questions that demonstrate someone has a strong grasp of concepts & fundamentals and that illustrate that they have experience with the language/platform in question. Have a few questions to see if the person is a good thinker, creative, and a problem solver -- I always liked SQL or pseudocode questions for that (e.g. write pseudocode to read a parent-child database and display a hierarchy). The questions partly depend on the level and type of position you're interviewing for.

Bad question: "What are the parameters of <obscure function> and which ones are optional?"

Good questions: "What are some methods to improve the performance of a data-driven web site?" "What is database normalization and what are some pros and cons about it?" "How can you implement caching in ASP.NET?" "In HTTP, what is GET and POST?" "Tell me about your experience with AJAX."

Then listen to their answers -- you'll know how deep their knowledge is based on how detailed and thorough their answers are. You can ask follow up questions if you want. For example, you might ask someone "What is ViewState in ASP.NET?" If they have a good response, you could then follow up with "What are some pros and cons about ViewState?" or "How can you develop an application without using ViewState, and what are some pros & cons to that?"

Have a written set of questions that you can print out when you interview candidates. The document should have fields at the top for job title, candidate name, time and date, and a yes/no decision. Then below can be a list of questions with space below to write down the candidates answers. During the screen, you can ask the questions and jot down their responses (or indicate their lack of response). At the end of the screen, go through the questions and "grade" each one. How you grade is up to you: it could just be Yes or No, or a point system, or grade school like A, B, C, D, E, F. Then go through, and make your decision on a candidate. Try to make the decision right there, and stick with it. The printed sheet is also good because it gives you a written record of the interview results in case your company gets sued later, or in case you're asked why you didn't hire Mr So-and-So, or if you encounter the candidate again in 6 months and wanted to remind yourself why you passed on them before.

Over time, you'll be adjusting your screening questions as you come up with better questions, or realize some questions suck, or that you never end up asking them. Another suggestion is to ask some of your existing staff the questions, and get their opinions on whether the questions are good. If none of your staff can answer a particular question, then that means either your questions aren't very good, or ...

In general, try to involve your staff -- they're a good resource and sounding board for you, they'll (often) appreciate being involved in the process (since they'll have to work with whomever you hire), and it's good training for them if they'll eventually become managers. Some staff won't be interested, and that's ok.

Have your team meet candidates

Your team should interview candidates, too. After the interviewing is done, meet with the candidate a bit more & send them home, then meet with your staff right away and get their feedback. Getting feedback immediately is important because the sooner you get it, the better quality it'll be. And you need to get their feedback anyhow, because if you don't, then you're wasting your staff's time.

Sell Your Company

During the interview process, you should try to talk a bit about what it's like to work at your company and why it's a good place to work. Give them a little walking tour. Think of ways to make your company worth working at, because it'll make your current staff happier, it'll make it easier to attract good candidates, and even candidates that don't get hired (for whatever reason) might come back to you later or tell others about your company.

No company is perfect though, but don't lie to candidates. There's no reason to go on & on about the company's downsides, but I think being honest is important. You establish yourself as someone trustworthy. You also filter out people who would be a bad fit. E.g. if you lie & tell people that the team never works weekends, even though they do, then if someone comes to work for you that really can't accommodate weekend work, they'll probably be grumpy, quit later, waste everyone's time, and tell all their friends what a lying jerk you are. Or you'll be forced to live up to your lie & not make them work weekends, whereupon your current staff will say "hey how come New Guy doesn't work weekends but we do?"

Ah, lies and the web they weave.

Make a Decision

I don't agree with Joel's "if you have any doubts, don't hire the person." I wish I could, but I don't think it's practical for every company, when sometimes you're struggling to even find decent candidates, let alone great ones. I think it's a goal to aspire to, but perfect candidates are often hard to find, and sometimes you need to take a few days to decide on a candidate (or decide between a few good candidates). That having been said, if you know someone's no good, don't hire them. Don't ever be tempted to hire someone you don't like "just to get someone in the door."

And even though HR people will tell me it's a bad idea, I like to get back to candidates and let them know if they haven't been selected. I know the convention is sometimes to just blow people off, but that's rude IMO. I try not to go into specific details, because that can be a legal issue, although if someone's experience is clearly and severely lacking, I say so. Anyhow, candidates appreciate at least being told, "thanks for interviewing, it's not the right fit right now, but we'll keep you on file for openings down the road." It's about respect and honesty, which will help you in the future. People remember that you were one of the few hiring managers that was up front with them, and that your company was the place that employed people like you. And it's good karma.

If the candidate was good but just lacking in experience, I might say something like "you don't really have the experience we need, but keep us in mind and get back to us in a year or two, or if you get a chance to take some training."

Move Quickly!

Wow, did I say this post was going to be short? Anyhow, this is a very important point. If you find a candidate that you want, start them as soon as you possibly can! See, I even bolded that. Ask them when they can start. If they can start right away, get them in the next day, especially if they're good and interviewing with other companies. Have them come in and shadow another team member for a bit, or install a wiki and enter documentation into it, or do research, or something -- just get them in. And get them an offer in writing ASAP. If they're still working, see if they can swing in after work or for an afternoon even, just something to get their feet in the door. Something to physically establish that they are your future employee.

Why get them in right away? Because otherwise they might take another offer between the time they accept your offer and their official "start" time.

I lost several great candidates by not following this rule. I made offers, they accepted, and we set a start date of 2-3 weeks out. But since they were still interviewing, they ended up going with other jobs, or being talked out of the job. A common excuse was "my wife/husband doesn't like <insert random point about your company or the job> so I can't accept the job, sorry." Yes, I know they "accepted" the offer, and it's kinda lame of them to back out. But it happens, and you need to make sure it doesn't happen to you. If they're still working, it's less likely to happen, but it still might.

BTW, it's my belief that the "my spouse doesn't approve" excuse isn't always true (maybe 50/50), but people feel they need to give some sort of explanation on why they changed their mind, and saying someone else vetoed their decision means that hey, they would have kept their acceptance of your offer, but since their better half said no...

Final Thoughts

Ok, I need to wrap this post up. I meant for this to be a quick post, but I guess I just had a lot to say.

So...hiring people is a lot of work, but it's arguably your most vital function as a manager. The more effort you put into finding good people, the happier you'll be.

May 31, 2007    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Wednesday, May 30, 2007
 
 

VPS Hunt

I've been looking into VPS hosting a bit more and found a few well-recommended providers:

ServInt especially seems to get a lot of kudos, but I know MediaTemple is very popular with the designer crowd. And by looking at my site you know I'm a developer not a designer. ;) A designer friend of mine uses and likes RimuHosting a lot.

GoDaddy Virtual Dedicated Server

Personally, I have months of hands-on experience with GoDaddy's VPS offering, which is pretty inexpensive, and clients have heard of them (or at least seen their SuperBowl commercials). Price is good, performance is ok (not great), but it's a very no-frills offering, and you have to be prepared to administer the server and manage backups yourself. Most of their VPSes are Linux, so you'll be using the shell a lot, but they also offer a Windows 2003 VPS with 10GB of space starting around $40/mo, so you can Remote Desktop into that.

You can pay for better control panels, managed backup, etc., but then the price starts to get into the $60-$100+/mo range, at which point you may want to look at one of the above VPS providers instead.

I also don't know whether they offer any kind of quick upgrade path, in case your site suddenly gets popular and you need to move your VPS to a big dedicated box pronto. I kinda doubt it.

Rolling Stones Gather No ... Mosso?

Other than VPSes, I was also intrigued by Mosso's offering -- hybrid hosting allowing you to run PHP and ASP/ASP.NET sites in the same set of files. However, I don't really care so much about running PHP & ASP side-by-side, since if I really have that kind of blend I might just get two VPSes (one LAMP, one Windows). I was more interested in their focus on making it easier for development companies to provide turnkey hosting and 24x7 tech support services for their clients.

However, they don't support ASP.NET 2.0, which for me is a dealbreaker -- I'd be doing my clients a disservice if I didn't give them the opportunity to upgrade ASP.NET 1.1 sites to 2.0 -- development is faster & easier, features are better, and performance is greater. Plus I have several .NET 2.0 sites already.

 

May 30, 2007    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Monday, May 21, 2007
 
 

An interesting case study over at the CakePHP site about Mingle2, a dating site built in "66.5 Hours."

What I liked about the case study was the developer talked about techniques he used to flesh out features and manage scope. IMO scope control is your most powerful weapon in getting something developed quickly -- many projects can get bogged down with small details that aren't as important yet end up taking a lot of time.

I believe there was a quote I read once, something like "the first 80% of a project takes 80% of the time, and the other 20% takes the other 80% of the time." Or other variants of the 80/20 rule, like "20% of the effort is spent on 80% of the features," etc.

Feel free to make up your own quote, using the numbers "80" and "20," that basically means you can deliver a subset of features significantly faster than an entire set of features, so to develop sites quickly, you should select a good subset of features and build those.

Since the case study is about a dating site, I should probably point out that the developer is single, which gives him more time to put towards startups. I only mention this because Paul Graham blatantly said he "wouldn't advise anyone with a family to start a startup" and "to start startups when you're young." (point #9 in Why to Not Not Start a Startup)

So all you Web 2.0 barons out there -- ditch your significant others for the time being & crank out that web site. Once you're rich from getting acquired by Google, you can try to convince your lost love to come back with expensive reconciliation gifts.

Wait...how did this "rapid development" post turn from scope management to dumping girlfriends? Man, blogs are funny.

Web
May 21, 2007    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 
 

A few Web 2.0 apps I've noticed recently

  • SlimTimer is a time-tracking web site.
  • BlinkSale lets you send invoices. You can import data from Basecamp.
  • Cashboard lets you track time and send invoices. It integrates with Basecamp.
  • Freshbooks also has time tracking and invoicing. It can also do online invoicing/payment. It integrates with Basecamp.

There are probably plenty of others, but anyhow. [edit: like the FOSS BambooInvoice for CodeIgniter]

BTW, is everything Web 2.0 written in Ruby on Rails lately? :)

May 21, 2007    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]



 Sunday, May 20, 2007
 
 

I was writing on a Startupping thread about scalability and figured I could reproduce some of what I wrote here. The topic was about planning and dealing with having to scale web sites as traffic increases. I pasted on some of my responses & added some headings that give a frame of reference to what I'm babbling about. Again, the below is personal experience and opinion, and there's a lot of information on the web to supplement (and I'm sure in some cases contradict) what I refer to, below.

Planning to Scale

In my previous life at a big dot-com, we actually started thinking about multiple servers right away, in order to provide uptime/redundancy & zero-downtime code deployment. We learned along the way, did a lot of research, and/or hired good people with experience. It's always good to have good people. We also hired a few specialty consultants for a few hours of suggestions, and worked with hosting providers who had other big clients, so that we could benefit from their experience.

We started out using software load balancing, moved to hardware load balancers, & eventually to round robin DNS between two large server farms (which had their own hardware load balancers, redundant everything, etc).

We had issues with scaling whenever we hit a specific wall, e.g. when we hit bandwidth & server limits for routers, firewalls, & data centers. We had issues when we hit certain technology limits. We also had issues if we got slashdotted, but that happens. One year we were unexpectedly linked to by a very large, prominent ad on the home page of a top 5 site, so our traffic levels went through the roof, we all got called at 4am, and we stayed pretty busy ensuring things kept running.

A few things we did

  • We used a managed hosting provider who could prep & deliver new servers quickly, to help us with scaling quickly. Managed hosting also meant the provider could help out with monitoring, troubleshooting, setup, and solving problems. So e.g. if you lose a PSU at 2am, you don't have to drive down to a colo and swap it out.
  • We did regular load & performance testing so we knew how many servers we'd need for certain traffic levels. We also did profiling to pinpoint bottlenecks, optimize certain parts of the site, etc.
  • We worked closely with our marketing team, so that we knew about upcoming media blitzes. We kept alerts on blogs & news sites to watch for links, & we kept an eye on our traffic.
  • We had monitors on our servers, so that if traffic/bandwidth/cpu started climbing unexpectedly high, we were alerted & could react before it was too late.
  • We looked at our traffic history so that we knew what times, days, & seasons were popular for our site.
  • We designed our software for easy deployment & replication, & streamlined our server setup process so that once a new server was ready, we could add it into the farm quickly.
  • We consciously built out our site to handle a certain load level, e.g. 3x last year's peak or whatever (3x is a made up example). You obviously need to handle spikes, but being ready & able to handle an "infinite" level of traffic isn't cost-effective, especially when you're young & trying to spend wisely.
  • We planned for & expected scalability & multiple boxes right away.
  • We had remote access to servers, reports, & monitoring tools, so that if a crisis occurred in the off hours, we could contact staff & not wait for them to get into the office.
  • We had names, functions, & phone numbers of key staff printed up on a laminated card (business card size) & given out to a number of staff, so that people could quickly contact others in case of an emergency.
  • We bought staff donuts or pizza or food. It was a cheap way to say thank you & made them feel appreciated & more willing to not complain (too much) when getting calls in the wee hours.

In hindsight, maybe we could have gotten away with spending less time thinking about scalability (or maybe not), but that would have increased our risk of disaster/embarrassment/etc, and potentially made for more painful & frequent firefighting. So there's the tradeoff. Just like other things in business, you can spent extra time and money up front to be more prepared for business growth, or you can wait until later and possibly pay more and feel more pain.

How do you know what load your site should handle? Should it be 3x last year's peak?

There's no magic number. We typically used 2x previous peak as a starting point only, and worked from there based on various factors. We put a good amount of thought into measuring our server performance and determining the traffic we expected and/or wanted to be able to handle, because it translated directly into how many servers we rented and thus how much money we spent on hardware. The load/server number really depends on your budget, your expected growth (including what your marketing team has up their sleeve), your risk/downtime tolerance (including SLAs or clients you have to maintain), and how fast you can scale. I mean, if you started out very small last year, and your marketing department is going to buy a superbowl ad this year, your traffic is going to be 100x last year's mark, not 3x.

So since capacity costs money (and unused capacity gets noticed), you have to plan it out a bit. If you just follow the rule of thumb and buy/rent enough equipment for twice last year's peak (or whatever), then that means most of the time your web servers are running at 1-15% capacity. And unless you have a lot of money, that means you might have management or investors asking you "hey, how come we spend so much money on servers when they're only running at 10%?" We mitigated that issue somewhat by having some servers keep busy performing "non-essential" functions (internal reports, data crunching, load testing, QA, etc) that could be curtailed during a crisis where we need every drop of CPU.

The whole "running at 10% cpu 90% of the time" issue one reason why expandable services like CDNs (content delivery networks), S3, & EC2 are intriguing, b/c in theory they allow you to scale some aspects of your service on demand without having a lot of extra horsepower & bandwidth sitting around unused. Or why VPSes are kinda interesting since you can potentially do some really quick deployments.

Another thing we planned from early on -- we planned to have our images & static files (css, js, etc) running on a separate domain, which allowed us to serve up static files using CDNs or other sources of cheap, fast bandwidth. That also helped us not max out router/datacenter bandwidth (at least not for a while), since images/css/etc are often a large portion of your outbound bandwidth.

Any must-have tools for performance analysis and dealing with traffic?

We were on a Windows platform, so it was tools like Web Application Stress Tool, LoadRunner, and Visual Studio Enterprise Architect's stress/load tool, among others. And of course you'll also want some sort of web analytics package (AWStats, google analystics, webtrends, etc) to tell you what typical user behavior is, what your most popular pages are, etc. Because your tests should mirror typical user behavior if possible. You'll also need performance monitoring tools like PerfMon, etc, so you can see how your servers perform under various loads. So you figure out the page activity levels for a given number of users, max requests per second, max/avg response time, cpu load, how high cpu/ram/disk can go before your performance & user experience starts to drop. There may be better/other tools today, and I don't know what platform you're targeting, but those can get you started. I think it's ok to start with simple tools. We used Excel a good amount, too, to map, graph, and view performance test data.

For monitoring, we used the tools that our hosting provider had (we had managed hosting), but we also had a simple script that ran every X minutes, tried downloading a page, tried executing a database query, checked cpu/ram/etc, & blasted out an email if things seemed wrong. We also wrote our web site to log errors & send out emails if for example, database queries were timing out, or if code started getting bad errors like "out of memory". There are also a number of third party apps & sites that can monitor your site or servers every X minutes & send you alerts -- some will check your serevrs remotely (e.g. Gomez, Webmetrics), while others can install on your servers. I can't think of any installed apps offhand to recommend, but I'm sure you can find something workable w/ some research.

When you start having scaling issues, does your staff spend all their time on scaling instead of development?

If you don't hire any additional staff & don't outsource any work, then yes, as your site gets bigger and your company grows, there's going to be more work to do, and your initial team will probably be spending more time on support/scalability/firefighting/misc tasks.

For us, as the site got more popular, more time needed to be spent on performance/scalability/uptime issues. But we still had features to develop. So we hired more people to keep up with increasing workload.

A supplementary route would be to go with a higher-level hosting provider (e.g. Rackspace) & pay them to help you scale out, and/or hire short term scalability consultants who can give you suggestions, etc. If your app can already scale horizontally, that helps, b/c then you have the luxury of having a choice: either spend time making your app faster, or money buying new servers. Or both.

Another suggestion: if you're starting out very small & cheap, you could start with a VPS on a single server, since you can quickly move that VPS to a bigger/faster machine before you need to scale to multiple machines. Once you go multi-server, you may even want to stick w/ VPSes, since the additional ease of backups/migrations/deployment might make up for the performance hit. Since virtualization technology is getting better all the time, the performance impact of running VPSes is smaller than you'd think (e.g. Xen is supposedly only a 5% hit). 

How quickly you can scale make a big difference in terms of the time you spend on capacity planning and actually scaling your site. Akamai also has some neat stuff (although it can be expensive) that allows them to serve up dynamic pages on their CDN, which in turn reduces the load on your main servers & prevents you from having to set up extra servers as quickly. Think of it like a front-end cache/reverse proxy type thing. Other CDNs might have similar offerings. There are also accelerators (both hardware, or software like Squid) that do similar stuff, although setting up your own front-end cache w/ stuff like Squid means you're losing one of the big benefits of CDNs, namely that they do the scaling instead of you.

 

Hosting | Other | Web
May 20, 2007    Bookmark to Digg or other social bookmarking
#    Disclaimer  |  Comments [0]