Quite a few times on here, such as in the recent Apprentice thread, comments about the importance of interviews have been tossed about. This goes along with the keeper of the board, Joel, who has written several times about the importance of hiring the absolute best of the best, and being absolutely certain of the choice that you make.
Why?
Seriously, I dont get this. If you are on the fence, and there arent any other credible candidates in the running, bring the person onboard, and if things arent looking good in real world projects, using real world technologies, in your real world organization, by the end of the probation period (or by the end of the first week if things are going so bad), part ways.
Indeed going back to the Apprentice thread, its interesting how many opinions of Amy dropped precipitously because she interviewed poorly. She did great in the real world, but failed in the artificial world of interviews, thus shes a no hire. Very odd.
I say this because of a similarity with another artificial/reality situation -- Here in Ontario the government is tossing around the idea of mandatory driver retesting every 10-15 years. The idea is that this would get bad drivers off the road, and I see a lot of correlations with putting too much of an emphasis on interviews: Instead of actually actively enforcing the laws in the real world testing environment of the real world, where people drive as they really do, they would like everyone to artificial drive with their hands at 10 and 2, putting on their faux driving face. How absurd.
Sun 11 Apr | Brad Wilson | Hiring the wrong person is usually at least 10x as expensive as failing to hire the right person.
Never EVER hire unless you're SURE.
Sun 11 Apr | Joe Blandy | 'She did great in the real world, but failed in the artificial world of interviews'
I wouldn't count anything on that 'reality' TV show as part of the 'real world'.
So if interviews are all so artificial, are we just supposed to hire the first person through the door? I guess I see your point, sort of, but what are we supposed to do about it?
Sun 11 Apr | . | 'Hiring the wrong person is usually at least 10x as expensive as failing to hire the right person.'
Uh....ok....
Here's one I just made up to support my claim (or someone else made to support their claim, and I blindly repeat. There's plenty of nonsense statistics to support any position): Failing to hire who would be the right person because you weren't 'sure' costs 1007.2x more than hiring who seems to be the right person at an interview.
I'm not saying that one should just hire anyone. Not even remotely (and as an aside - before I started my own business, I represented myself extremely well in this context. My interview to offer ratio was close to 1:1. This isn't self-defense). I'm just saying that this crusade to be supposedly 'sure' is a big giant pile of rhetoric and bullshit. When you get such a highly regimented hiring process that makes you 'sure' that you hired the right person, you're far more likely to implement a workplace culture and atmosphere that protects and insulates incompetence (lest it conflict with the 'A's hiring A's' myth). I've worked at shops like this where they were incredibly anal and 'sure' with the hiring (only the 'best' from the 'best' schools who did the 'best' on the manufactured how-to-move-mt.fuji tests), and absolutely incompetent boobs made it in (though the strict scientific interview failed to reveal this). They became untouchable: It was a personal attack on any involved in their hiring to claim anything other than them being the second coming (little Easter related reference there). Saying that you only hire the best, as Joel does, absolutely sets you up to hide the fact that you don't hire only the best, or that the best just aren't the best in your organization.
In the end what I'm saying is perhaps that the rarity of firings, or cultures that accept that some relationships don't work, encourages failure. There are some obvious parallels with romantic relationships here as well. Hiring someone shouldn't be such a life long commitment (as being hired isn't a life long commitment by most employees -- if they find they don't like it they jump to another ship), and definitely shouldn't be treated as if it is.
Sun 11 Apr | FullNameRequired | ' Saying that you only hire the best, as Joel does, absolutely sets you up to hide the fact that you don't hire only the best, or that the best just aren't the best in your organization.
'
this sounds dangerously like good common sense.
are you sure you are at the right forum?
Sun 11 Apr | Philo | There are a bajillion job applicants out there. This was even true during the dotcom boom. When you hire someone, you stop looking.
What you are in effect saying is 'hey, I'm 23 and I'm not married. Sure I haven't met 'Ms. Right', but what the heck - I'll just marry the next best thing. If she doesn't work out, I'll just divorce her.'
So, best case - you get a diamond in the rough and everyone is happy. (rare)
Or you get an average person who kinda does an okay job. You're going to be hard-pressed to dump them just because they do an okay job.
Or you get Omarosa, who's going to sue you if you even *think* about firing her without a year's worth of poor evaluations.
And the next day Chris Sells' calls and says he wants to come work for you. [eek!]
Going back to the restaurant analogy - if you're trying to staff a McDonald's, then you just hire your 'best guesses' to man the trenches - you can give yourself enough fodder to find some stars to pull up to the top.
But if you've got five superstars and you're looking for #6, then you keep looking until everyone is positive you've got them. They're out there, you just have to find them.
There's a study that indicates that an excellent coder is something on the order of eighty times more effective than an average coder. Since your average coder wants $50k, and you need $90k to land the excellent coder you want, isn't it a wise investment to simply leave the opening empty until you find that superstar?
Finally, falling back to old faithful:
Microsoft believes it's more cost-effective to not hire an excellent candidate than to hire a mediocre one. Who are we to argue with their methods? ;-)
Philo
Sun 11 Apr | no name | The interview segment was probably the most "real" thing that occurred on that show. How Amy's future peers/bosses felt about her was very important because she was applying for a desk job and would most likely be interacting with at least some of them on a daily basis.
Sun 11 Apr | sgf | 'There's a study that indicates that an excellent coder is something on the order of eighty times more effective than an average coder'
I keep hearing this reference, with various numbers. I don't believe it. Anyone have a reference to an actual study??
Sun 11 Apr | Sexist | The original quote was from 'The Mythical Man Month', and I believe it was more like '10' times more productive rather than '80' times, and it refered to lines of code per day. Back then (1960s), when people still coded in assembly language and there were no extensive APIs to handle common tasks, I think the 10x factor might have been valid. Probably not so today.
But yeah, I agree with you that any number at all seems bogus. If one guy writes lots of code but the second guy writes less code with fewer bugs and the third guy writes the best code of all but has a bad attitude and the fourth guy writes very little code but guides the team's whiteboard designs -- well, which one is the most productive? And how can you quantify what the 10x, 80x, 2x multiplier is?
Sun 11 Apr | Dennis Atkins | 'In Ontario the government is tossing around the idea of mandatory driver retesting'
Um, it's not about safely in the least, don't you see? It's all about the fees.
Sun 11 Apr | Dennis Atkins | The 10x figure is from Peopleware not Man Month. It's for short term projects. The language was the programmers choice. The best were 10 times faster, made ten times fewer errors and wrote ten times fewer lines to accomplish the same goals.
Sun 11 Apr | Dennis Atkins | Oh and the reason that it is 80 times nowadays is because you will have one guy writing in C# or using C++ and the STL. these guys will be 80x faster than the guy reimplementing basic functionality from scratch in whatever language.
* Does the ShareWare model is still viable in 2004 ?
Last shareware success story Im aware of was in the
early 90s with ID Software (Doom), published by Apogee back then ...
I had a look at successful shareware products and they now seems to be published not by one single guy out
of his appartment but by fairly large company :
SnagIt (www.techsmith.com)
CuteFTP (www.globascape.com)
ShareWare History :
http://www.asp-shareware.org/users/history-of-shareware.asp
Am I born 20 years too late ;-)
So guys what do yo think ?
Is it possible for someone to make it big via the shareware model ?
Sun 11 Apr | Famous Shareware Developer | I am making almost $350/month after many years of hard work developing and marketing my shareware products. So, yes it can work, but you have to do a lot of work to build it up to be as strong as a company like mine.
Sun 11 Apr | JSD | $350 a month?
I guess the answer is yes, shareware is gone :)
More seriously, maybe $350 is enough where you live but here (UK) it's next to nothing. The last success story I heard was about the author of Homesite. It is a very good product and he sold it to Macromedia.
JSD
Sun 11 Apr | Dewd | Perhaps open source has substituted shareware.
There are open source projects everywhere nowadays. Even Microsoft has released one as open source.
Sun 11 Apr | Ken Klose | Famous Shareware Developer: what's your product. I'd like to see what's worth $350/month.
Sun 11 Apr | Noname | What is "shareware" nowadays? Even big expensive software like Oracle and Perforce have free downloadable versions.
Sun 11 Apr | Dan Maas | I think limited-free-download is probably a better model than (honor-system) shareware.
One shareware author did a controlled study, releasing both a limited (trial) and non-limited (shareware) version of his software. The purchase rate for the limited version was three times that of the non-limited version. I think this one has been cited here before.
Sun 11 Apr | Mark Hoffman |
I think the $350/month comment was sarcasm, guys..Note the line about a 'company as strong as mine'.
Sun 11 Apr | anon to protect the guilty | But yes, only if the does speaks the english model still viable is in the millenium new new.
Sun 11 Apr | help me understand | OT: I sometimes see posts like the one here from 'Anon to protect the guilty' and I think to myself, 'What is this sentence trying to say?'.
So, I break out my decoder ring. Maybe this person can't speak English very well, maybe they are bad at typing. However words like viable and millenium stand out as words a fluent English speaker would know, and I don't see any common typing errors.
Is this some hackers' test, or back channel communication? I am annoyed by this.
Sun 11 Apr | duh | Zoom. The sound of sarcasm going over the head...
This is another perspective on how employees should be treated, and has some relevance to this recent thread on Loyalty:
http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&ixPost=131434
Here is the article:
http://www.gamasutra.com/columns/fristrom/20040312/fristrom_01.shtml (free registration required)
It even refers to one of Joels articles.
Some interesting pieces:
************************
Fickle employees are a part of business. Loyalty is a forgotten concept--these days, if you have talent, you ask, What can the company do for me? first, and What can I do for the company? second. And theres nothing wrong with that--since the typical companys goal is to give their employees as little as possible, and get out of them as much as possible, its not surprising that people have this attitude. If they didnt have this attitude, theyd be taken advantage of.
...
... management guru Peter Drucker says that you should treat your employees as if they were part of a volunteer organization. Which isnt as lax as it sounds: Drucker is talking about volunteer organizations like the Boy Scouts and the church--organizations where people set goals for themselves and if they fail to achieve those goals, are let go.
When a rock star tells us--or even just implies--that its not our game, its theirs, we look for some other place to go where we can make a game we can call ours. We go volunteer somewhere else.
************************
So, are we really nothing more than paid volunteers?
Sun 11 Apr | one programmer's opinion | When it comes to loyalty, I don't believe developers owe their employers anything unless the employer has forked over a lot of cash to train them. Many developers leave an employer for more money because they understand that their opportunity to make a decent living developing software tends to be short lived.
Sun 11 Apr | Philo | Looks like someone's trying to create a meme.
Loyalty is alive and well. Just about anybody working at Microsoft could walk away and double their pay immediately. While the stock may hold long-term promise, it's not the millionaire maker it was ten years ago.
So why does Microsoft (which most people know pays below industry average) have 50k+ employees?
Because we're treated well and we believe in our employer. When I plug MS products on here, I don't plug products because I'm expected to, or because I'm a paid shill - it's because I honestly believe in the products and what they can do.
I feel loyal to Microsoft because I feel there's a true relationship. Sure, they pay me in exchange for work, but there's more to it than that.
A couple of people have said on here a couple of times - why is it so very hard for companies to follow the thought pattern of 'we want to be a successful software development shop - maybe we should look at a very successful company and see what they do, then copy that'?
Treat your employees like people, not 'human capital'
Give them the authority to do their jobs
Trust them
Treat them well
Those are some very basic ideas, but they work.
Philo
Sun 11 Apr | no name | '''Just about anybody working at Microsoft could walk away and double their pay immediately'''
You're so full of sh*t I can smell you from here. Unless you're talking about the consulting arm, which is where you work I believe, I don't know about the consulting side.
Sun 11 Apr | Skeptic | 'organizations like the Boy Scouts and the church--organizations where people set goals for themselves and if they fail to achieve those goals, are let go.'
??? They kick you out of the boy scouts and churches if you don't meet your stated goals????
???
Sun 11 Apr | Skeptic | philo,
microsoft pays substandard wages? that made sense when you made a killing on the stocks and bonuses but those days are gone.
it doesn't make sens eto me that they respect their employees if they pay substandard wages. sounds like they are merely taking advantage of them.
Sun 11 Apr | Richard Kuo | Pay usually isn't the motivating factor at highly rated companies. It doesn't hurt, but it doesn't factor in as highly as other aspects of the job.
Generally speaking, you don't f*** other people just because you can. Apparently this runs contrary to a lot of the disgruntled masses on this board, but some of you need to reassess and learn the lesson now. Believe it or not, a lot of people and employers (yes employers are people too) follow that rule.
Sun 11 Apr | Dewd | 'It also creates what Jim McCarthy calls 'the guy in a room' phenomenon. You put all of your hopes on one guy, and then wait. And wait. And wait.'
LOL. I am that guy. Sorry for making you wait. wait. wait. :-)
Sun 11 Apr | Motown (AU) | 'Generally speaking, you don't f*** other people just because you can. Apparently this runs contrary to a lot of the disgruntled masses on this board, but some of you need to reassess and learn the lesson now.'
Amen to that.
Perhaps it's because I don't live in cubicle-land, but in the circles I move (SMEs), employment is far more than a business transaction where $X buys you Y committment. Here there's a whole world of give and take as people generally try to get along and get the job done.
Sun 11 Apr | -- | Pardon my ignorance, but SME=???
Sun 11 Apr | a cynic writes... | SME = small / medium enterprise.
Back to the main discussion - *extra* money isn't usually a motivating factor but if pay is seen as unfairly low it can demotivate. This is called a 'hygiene factor'. Boring things like professional pride are the real motivators for most people.
Sun 11 Apr | www.marktaw.com | My (ex) boss offered $100 to the person who fixed the most bugs. Maybe for the Indian programmers making who knows what (did I hear $40 a day? thrown around?) this was a motivator, but I tend to lump salaries into 2 categories - won't change my lifestyle, will change my lifestyle.
I was actually insulted that he'd offer a monetary reward & think that that's what motivated us, and simultaneously taken aback by his stupidity.
I nearly fell out of my chair the next week when he used the term 'Man-Month' in a sentance seriously. It was particularly funny since I'd just finished reading about the mythical kind.
Sun 11 Apr | www.marktaw.com | Now where is that thread on the Prisoner's Dilemma... Here it is:
http://discuss.fogcreek.com/joelonsoftware/default.asp?cmd=show&ixPost=125360
Sun 11 Apr | anon | > employment is far more than a business transaction where $X buys you Y committment
Absolutely! When i am well paid, i am honest and loyal. When my pay is below average or I am forced to work too many hours, I steal everything I can. Last year I made $200,000 selling the companies proprietary source code to their competitor overseas. That'll teach them.
See, it all works out in the end.
Hey folks. Longtime lurker, first-time poster here. Ive got kinda of a weird question. Im nearing the end of my junior year of college (CS major) and am trying to figure out what to do post-graduation to maximize my future employability.
Originally, I was thinking of doing a one-year masters program in CS (perhaps specializing in networks or info security, both of which Ive been interested in for a long time). But then, I became aware of a one-year MBA program offered by my school. After that, I began to wonder if an MBA might be a worthwhile thing for me to consider. This occurred to me largely based on several posts Ive read here on the JoS forum, that seem to indicate that it is impossible to sustain a lifelong career as a programmer without eventually going to management.
Anyway, I was just wondering if I could get some input from anybody who might have an idea as to the value of either or both of these kinds of degrees.
Thanks much.
Sun 11 Apr | Philo | If you don't think four years of college makes you employable, what makes you think five years will?
I strongly advise anyone who asks against going straight into a graduate program after getting their bachelor's degree.
1) You're spending a year spending money instead of earning it; even working a minimum wage internship would be fiscally better
2) In general in IT, an MSCS doesn't really add value. An MSCS with no work experience would be effectively worthless.
3) I feel that I got a lot more out of my law degree for having had real-world experience. I cannot imagine absorbing all those concepts meaningfully at 21.
4) Examine why you want an MSCS - I suspect quite a few people get their master's directly out of fear of the real world. Might as well face it now, it's cheaper.
5) If you find out that you hate programming, you've really wasted some time and money.
Personally, I think if academic institutions were intellectually honest, they wouldn't accept Master's degree candidates that had no work experience. Of course, that would hurt profits...
Now everything has an exception, and this is no different - if you've got a genuine once-in-a-lifetime opportunity (Rhodes Scholarship, apprenticeship with a significant member of the community, unique learning opportunity) then go for it. But if we're talking about the idle musings of a college senior, get out there and get a job. :-)
Philo
Sun 11 Apr | RP | Same here. While the thread I opened before makes me look like a bit of an idiot I do know that getting yourself educated without some real life education is useless.
Sun 11 Apr | Mark Hoffman |
Well, as someone who regretted not having more education, I would lean more towards going after the masters.
If you're having to choose between a masters in CS or an MBA, then I would recommend giving the MBA serious consideration. A person with strong technical skills that understand business principles is still a rare find these days.
I agree with Philo that no amount of education can replace real world experience. It's still the best teacher. But that isn't to say that more education is a bad thing.
Sun 11 Apr | Lou | Possibly the best thing you can do to make yourself employable is to get employed - get an internship or co-op and get involved with a company delivering a solid product.
As far as an MBA versus a Masters in CS - most discussions here have come the general conclusion that a masters in CS isn't really worth the time and money invested - it's experience that tends to matter most. As for the MBA - it is entirely possible to have a long career as a programmer and not get into management - however you'll likely be involved as a project lead or put in charge of a project at some point. To that end getting exposure to some project management and general managerial education is likely beneficial. Your options here include getting another BS in Industrial Engineering, Management (even a BA would be adequate in Management), or even a BS in MIS. It's the generalist business background that will allow you to take your CS education and capitalize on it in the job market (at least that's my experience).
Sun 11 Apr | T. Norman | MSCS only helps if at least one of the following apply:
- Your bachelor's degree wasn't in CS.
- The MSCS program provides the opportunity to work on very specialized, innovative material, such as natural language translation or cryptography.
- You plan to do a PhD in CS.
- You live in a country outside the US where the MSCS is respected more than a BSCS.
- You plan to teach CS at the college level (a PhD is not always required).
- You went to a no-name school for your CS bachelors and have been accepted to a big-name place for your MS, like MIT or Carnegie Mellon.
Sun 11 Apr | babs | Thanks for the comments I've gotten so far. Several of you have said that an MSCS is worth very little. What I'm curious about is, are you saying that any master's in CS is worthless, or are you only referring to a 'general' MS degree in CS? For example, if I were interested in working in the area of network security, might it be advantageous if I were to obtain a master's in that specific discipline, which I've seen that several schools offer? Or would I be somehow limiting my options in doing that?
Thanks again.
Sun 11 Apr | one programmer's opinion | Babs,
While I agree with Philo that no amount of education can replace real world experience, I believe it is a lot easier to pursue your educational goals when you are young and not working. My advice to you is to stay in school and pursue your MBA. If feasible seek out an internship as well so that you have something else to put on your resume.
Sun 11 Apr | Canuck | I have never regretted not getting an MS in computer science.
I do however, kick myself daily for not getting an MBA.
Sun 11 Apr | Nick | An MBA directly after a BS is generally worthless, but an MSCS isn't. If you're interested in a particular field to specialize in (networking or security) that's exactly what an MSCS is good for.
If you're concerned about employability in general, what others have said above is generally true. But if you specifically want to target your job search to security, for example, then getting the MS would be helpful. If you live in the US it would be more beneficial if the MS program was recognized by the NSA as a center for academic excellent in information assurance: http://www.nsa.gov/ia/academia/index.cfm
If you want to switch over into management, then work for 3-5 years before pursuing the MBA. Getting an MBA when they switched career tracks has given a lot of people I know a 'bounce'.
Despite what some people have said above, I have seen a lot of job ads in the last few years that say MSCS preferred or required. That said, you may be screened from other jobs that don't want to pay for someone with an MS.
But I truly believe that in the long run, more education is beneificial in the job market. As the IT field gets more mature, I would expect more organizations to be more demanding of their candidates - especially if legal liability becomes more of an issue.
Sun 11 Apr | Philo | 'I believe it is a lot easier to pursue your educational goals when you are young and not working'
All the more reason for an employer to value it less. ;-)
An interesting side-effect of having work experience while taking graduate classes is that a) it's easier to get good grades, and b) it's easier to thresh the wheat from the chaff in the material.
MSCS in robotics or crypto vs. someone who's been working for two years in the robotics or crypto industries? I'll take the latter every time.
If you really, really, really want an MSCS, then graduate, get a job near a good university that offers an evening MSCS program, and get it at night.
If that's not appealing, question how badly you want the MSCS.
Philo
Sun 11 Apr | T. Norman | But Philo ... someone without significant experience may find it impossible to get entry into the robotics or crypto fields without an MSCS.
Sun 11 Apr | Blah | An mba without working experience is worthless. Only the lowest ranked mba programs will accept candidates with no work experience.
Sun 11 Apr | Dennis Atkins | Philo is right. Somone with a MSCS and no experience is a wanker who expects too much pay. Probably not literally true, but that is how employers will view you.
A PhD is usually worth little too except when you yourself initiated substantial and important research and published in the leading journals.
Of course you can publish in the same journals without a pHD and its a lot cheaper and is worth just as much. Main difference is when you are done YOU own your invention and not the university. that puts you in a good position.
This is all US. Outside of North America in almost all teh world a masters is equivalent to an american bachelors and a foreign bachelors is equivalent to an american community collece certificate. If you don't believe me, you haven't interviewed people with these degrees
Sun 11 Apr | no name | T Norman highlights something very interesting - that a Masters in CS is useful only if your first degree wasn't in CS.
It might not be so true now, but there was a time when the only people doing MSCS's were people without talent. They needed something extra to get a job. To me, a masters still has that feel if it's not backed up by a PhD.
If someone really is a good researcher, he or she will have the PhD, or equivalent projects at some company. If they have a masters, they lacked the talent to get a job.
Sun 11 Apr | Dino | The best thing to do is to contact the career services office of the schools you are thinking about attending and see what their placement rate is like. I would also contact some professors and get names and numbers of recently graduated master's students who had a concentration in network security.
Data from the career services offfice and info from recent graduates will be much more helpful than random, generic chatter from a message board.
Sun 11 Apr | Scott | I am getting a masters in CS part-time while working. I think it's a great way to go, especially if the tuition is paid for by your employer.
Sun 11 Apr | Steve Forest | I got my BS in CS (w/Business minor) in 1988 from Northern Illinois University. Since I had had two internships, I sorta had a good idea of what the typical jobs in the Chicago area were like at the time.
I decided to stay on at NIU and get my MS in Computer Science (it took a summer, fall, spring, and summer).
Why did I do it?
1) They knew me and were willing to waive my tuitition (I still had to pay fees) and give me $xxx a month in exchange for working 20 hours/week.
2) I still knew tons of people on campus, so it wasn't like I had to move to a strange town and be socially isolated.
3) I knew the CS program and exactly what to expect.
4) I didn't have bills that you tend to sign up for (i.e. car payments, etc.) once you start working.
5) I wanted to 'differentiate myself from the crowd'.
and the most important,
6) For the knowledge.
No one I work with knows I have an MS in CS (or BS for that matter!). There's no need to tell them and I don't think they really care.
I am completely happy with my decision to stay on and get my MS in CS at that time.
I had the 'momentum' from my BS to make the MS experience very smooth. (Notice I didn't say 'easy'.)
Sun 11 Apr | Philo | Your entire post is invalidated by this:
'1) They knew me and were willing to waive my tuitition (I still had to pay fees) and give me $xxx a month in exchange for working 20 hours/week'
You got free tuition, a stipend, *and* work experience. I'd call that a damn good reason to stick around. (which see: my exceptions above) ;-)
Philo
Sun 11 Apr | Dennis Atkins | 'It might not be so true now, but there was a time when the only people doing MSCS's were people without talent. They needed something extra to get a job.'
It's still true.
During these years as a software developer I realized there is something missing. Im not
talking about the grand scheme of things. I simply realized there is a tool that, if
developed right, would fit like a glove to a certain niche. I believe this is such a good
idea that Im not saying what product is to keep the competition away.
But some things plague me. I have never developed shrinkwrap software. I dont know what would
take to develop and test such an application. For this to work it would have to be
developed in VC++ (the best performing language on Windows, AFAIK). Speed is crucial. Im mostly a Java guy with some Swing and lots of EJB. The product itself is pretty complex, and it would require a strong knowledge of databases, especially a certain vendor, and that is something I am not an expert at.
Hell, I dont even know where to start. Now I come to realize: I have the idea, I believe I
have the niche but I dont have the tools or the know-how.
And how do I keep the long term vision, the motivation to work on this until revenue eventually starts to flow?
Any pointers on how to make this go ahead?
Sun 11 Apr | Fred | >> Speed is crucial.
VB for the interface, PB/DLL for the number crunching. I doubt you'll find any tool that'll let you be as productive, and not worry about dangling pointers and buffer overflows :-)
My E.20
Sun 11 Apr | Bored Bystander | >> Any pointers on how to make this go ahead?
I don't think you're exactly asking about courage. You're trying to figure out how to execute your idea.
If you're currently working and have an income, may I make a suggestion based upon what you're saying. And I am serious.
Define segments of your project and sub out the implementation work, in C++ or whatever, on rentacoder.com. Define segments of work that don't reveal the intent of the entire project.
A benefit of the subbing-out model is that you would be forced to engineer your entire concept from start to finish and you would have to divide your concept into functional areas.
A variant would be to sub out the development of performance critical sections in a compiled language, while you would develop the 'shell', the user interface, and/or the main application.
The reason I say this is that you're admitting that you don't currently know a language that would allow you to develop an entire redistributable product.
Sun 11 Apr | Philo | Prototype the thing in C# - it's close enough to Java that you should be able to pick it up pretty quickly, and the Visual Studio IDE will help you with your dev time.
If you really need microsecond gains, refactor the areas that need it into C++ (or even assembly language?)
You vaguely mention needing to understand the platform and databases and intricacy - unless you're thinking of a vendor-specific niche, I'd have to push SQL Server/Analysis services over PowerBuilder - both for ease of development and ease of understanding.
If you do sub out parts of the project, be sure to sub out parts that don't represent the whole, so you don't find yourself undercut in the market (this applies whether you sub locally or overseas).
[Yes, I'm wearing my Microsoft hat now, but I honestly believe in the time-to-market differentiators of our tools]
Philo
Sun 11 Apr | Mark Hoffman |
I might suggest to take a step back and assess your business skills or entreprenurial zeal before your technical abilities.
Not to sound harsh, but ideas are largely worthless. It's the ability to execute an idea that separates people. I'll go further and suggest that if your idea is destined for profitability, then it probably isn't novel: There are probably several people with the same idea right now.
Don't be discouraged. As I said before, the ability to see an idea through profitable fruition is beyond most people so even if someone else has the same idea that you do, they might not be able to make it happen.
Eric Sink made a great book recommendation a while back that is a wonderful book for budding entrepreneurs. It's called 'You Need to Be a Little Crazy : The Truth about Starting and Growing Your Business' by Barry Moltz. It's an easy book to read and offers some home-spun advice from someone who has both failed and succeeded in business.
Sun 11 Apr | RP | > > I don't think you're exactly asking about courage. You're trying to figure out how to execute your idea.
That is absolutely right. I don't know where to begin and I am afraid to begin. What if it doesn't make any sense at all?
This seems to be such a huge undertaking that it makes my head go round. Are there any books? Articles? Websites?
Something to help me go along the way.
Sun 11 Apr | RP | Philo:
The thing must be done in C++. My experience tells me that Java or C# simply aren't up to snuff in terms of performance. We're talking about some very very heavy number crunching here.
Sun 11 Apr | Philo | RP, the number crunching isn't in the entire application, is it? You prototype in C#, then once you've got it working the way you want it, you refactor libraries in C++ as necessary.
Or, if you're crunching data, you look at Analysis Services to see if that makes more sense.
However, I'm going to take this all back now and agree with Mark - you're looking at a business proposition, and the first step in any business is a business plan...
Philo
Sun 11 Apr | x | Usually, I'm the first to be a performance bigot, since I
work on small, embedded systems where everything's
slow, sloppy programming is punished harshly, and the
classic 'just buy a faster CPU and more memory' fix isn't
relevant.
But in this case, designing your app
using a scripting language to prototype makes sense; you'll
get a feel for the UI and can work out issues with your
algorithm with small datasets, and if you're looking for
funding or customers, you'll have something to demo.
(This is good both for improving your UI as well as
showing some 'meat' as opposed to slideware.)
If you get funded or otherwise feel confident in going
forward, figure out the slow parts and recode those in C++.
(Note: db's are slow enough that recoding db interactor
code in C++ won't help so much. Number-crunching is
another story.)
Sun 11 Apr | RP | Yes, number crunching is another completely different thing and I expressed myself the wrong way back there.
What I mean is, this app must take as little memory as possible. I've developed in both Visual Basic and PowerBuilder, excelent languages when you want to write db driven apps, and both deliver an exceedingly big executable. And performance isn't that good when you have tons of thousands of records being dumped on you.
Sun 11 Apr | Philo | Dude, with all due respect, you're talking all over the place. 'Must use as little memory as possible' but 'having thousands of records dumped on you'?
'Thousands'? That's absolutely nothing in modern terms. I'll wager most senior programmers on JoS use thousands of records as test sets.
Once again, I suggest you slow down, take a deep breath, and start drafting a business plan, then start working on your requirements. You've got a ways to go before you have to worry about what platform.
Best of luck!
Philo
Sun 11 Apr | Philo | Oops - missed the 'tons'
But my last statements still apply. :)
Philo
Sun 11 Apr | C Rose | On the performance issue, the work I do involves heavy number crunching. As I'm a researcher (I'm not developing shrink-wrap), I use Matlab*, which is a very complete environment for the kind of work I do. It relies on BLAS and LAPACK for its matrix-vector stuff. These are portable implementations of state of the art numerical algorithms. I'd suggest you try to 'vectorise' your numerical problems, as you'll then be able to use the BLAS/LAPACK libraries (via C/C++) to get the best numerical performance (and your code will make use of SMP where available, etc.). These algorithms are also very well tested. They are also free.
On some work I did recently, where I was trying to optimise the computation of a Moore-Penrose pseudoinverse (and had to code in C), I found that GCC on Windows produced faster code than VC++ (by about 10%, and I tried lots of compiler flag combinations). Although the problem was quite specific, the algorithm was fairly generic (for loops, standard C stuff), so I'd expect similar results in general.
People also swear by the intel compilers, but I didn't need the speed that badly to go and buy a new compiler.
My advice is to first make sure your numerical algorithms are correct, maintainable, documented etc. If your program isn't fast enough, profile it, and then optimise the slow bits. It's silly to prematurely optimise, or worry about getting the best performance from day one. So long as you don't shoot yourself in the foot (e.g. by deciding you can do better than all the numerical algorithms researchers), you shouldn;t worry about performance too much -- concentrate on getting the thing to work at all.
*Matlab has a reputation for being slow -- but this is because, for everything other than matrix-vector stuff, it runs an interpreter. So, if you're a C coder and you try to write a matrix-matrix product in Matlab's interpreted language, it will be slow. When you know to use the built-in functions instead of writing your own, Matlab will beat 99.999% of hand-rolled numerical C code easily.
Sun 11 Apr | Konrad | The memory the application takes up may or may not be important. What definitely is important is that it meets the needs the customers perceive themselves as having and are willing to pay for. What is also important is that you go out and meet these customers and make sure you understand them, and they are willing to try out your product, and this can happen on the understanding that it is slow.
My opinion is that you are comfortable in a technical domain so you try to deal with that; and I'm not trying to be demeaning but that is one part in many, possibly one of the smallest parts, of running a business like this successfully. I only identify this because I've done just the same thing myself so I think I see your thinking; apologies if I have actually misread.
Sun 11 Apr | x | As for performance, the most important issue is what does
your market demand for performance? These need to
be answered, and it is rarely 'as fast as possible' (although
it sometimes is). For example, if a program is interactive,
a couple seconds delay in crunching is probably OK. If it's
part of a networked infrastructure with 'user' programs
interacting with it via API's, you may have more demanding
performance requirements.
Be sure to separate 'required by the market' from
'aesthetic'. Personally, I'm a huge aesthete in this sort
of thing, so I went to an area where the market and my
aesthetics complement each other :) But figuring out when
something is 'good enough' is extremely important,
particularly since you always have limited resources and
other things (UI, standards compliance, reporting
capabilities, etc) may be the things which determine
success - not raw performance.
Sun 11 Apr | JSD | Hi,
I have gone through the same experience and started pretty much with an equivalent skill set to what you have now.
It took me some five years and three releases to overcome most of the problems that you will probably have (and our product is number crunching at its best using anything from a few dozen to thousands of records) so be prepared for a steep and long learning curve. Having said that, shrinkwrap apps are not *that* different. You need attention to detail and you need to widen your knowledge to encompass UI design, usability and internationalisation. The first step is getting as many books as possible and read them.
We chose VB for the frontend and C++ DLLs for the time sensitive bits and the outcome wasn't bad at all. If I were to do it again I would probably go for a C++ only solution (either a portable one or MFC). On the other hand I learned a lot during the process and I am sure I would only be in v1 now had I started with C++ for everything.
What does help is figuring out what are the core features that your clients would want to see and concentrate there. If your app is sufficiently important your clients will probably not care if you don't support the latest bells and whistles. Very important: design for stability over speed for the first version(s). If it crashes all the time no one will see it fly over tons of records.
I think that the most important thing is not to despair too early, we are still very far from a large enough client base after all this time and I guess there's at least another five years until it starts in earnest for us.
Hope this helps.
JSD
Sun 11 Apr | the artist formerly known as prince | Whatever you do keep your day job, and farm out as much as possible.
Sun 11 Apr | jm | RP, I'm impressed that you understand the difficulty, and that you correctly identify the need to do it in C++.
I have gone down the path you describe and it's much harder than it seems to the outsider. (You, surprisingly, seem to have a feel for this.)
A VB framework with C++ modules is an attractive option, and it's how I started. Eventually I upgraded to all C++, and this delivered powerful benefits in power and portability. However there is definitely a trade-off.
C# and its .Net cousins are fine for in-house corporate development, but not for commercial apps. Apart from the dependencies, there's also the matter of code discovery.
Where do top candian CS programs come in as compared to the graduate programs in the US ?
Specifically , how good is the Univ Of British Columbia ? Compared to U toronto ?
Sun 11 Apr | Canuck | The University of Waterloo is recognized as best CS/Math school in Canada. Given its widely known reputation I would assume it should figure prominently on a resume, even abroad. I have worked with several graduates from this program and they were all quite gifted engineers and developers.
The Univeristy of Toronto is well respected as well. I work for a firm in Toronto and we hire talent from U of T almost exclusively. We have had great success with thier students. Very well rounded candidates for the most part.
Generally the top three Canadian schools for CS are:
Waterloo
Toronto
Queen's
Ive been investigating Flash and Flex a lot in the last month or so, and I have to say Im imipressed. The latest version of the Flash IDE (2004 MX Pro) can be configured to be used in a way very similar to visual basic (i.e. without any animation constructs like player head, timelines, layers, etc). XML parsing, web services, and integration with RDBMS systems are built in. And Actionscript 2 is completely object oriented, with intuitive (i.e. very similar to java) support for inheritance, interfaces, polymorphism, yada yada yada. And a standard collection of very plain, normal-looking UI widgets now ship with the product (as opposed to the flash trash so often pushed by designer types).
In terms of market penetration, Flash player 6 is at 92%, which is pretty good.
http://www.macromedia.com/software/player_census/flashplayer/version_penetration.html
There are still problems, of course. The largest one I can think of is that flash code is persisted as a .fla file, a proprietary binary format. Even if you externalize your actionscript code to text .as files, this still leaves a substantial amount of your work (i.e. all the graphical layout work) in a binary format, which means you cant diff versions to see what has been changing in your source control system.
The Flash player also apparantly has a memory leak in the Web Services parsing code: http://www.flashorb.com/articles/soap_vs_flash_remoting_benchmark.shtml
What else is stopping flash from becoming the new platform for web UI?
* There doesnt seem to be a good actionscript 2 book out yet (oreilly book comes out next month and should solve that problem).
* Flash has the designer taint that makes developers not take it seriously.
*Macromedia hasnt done a very good marketing job: Ive only discovered these capabilities because Ive made an effort to find out about this stuff.
Any other reasons Ive missed? What potential does flash have to do what java originally promised and failed to do (write once, run everywhere, distribute via the browser)?
Sun 11 Apr | John Topley (www.johntopley.com) | Flash has traditionally had a poor accessibility story, although I hear that they've tackled that with the latest version.
Sun 11 Apr | Mr. Analogy | 'Flash has traditionally had a poor accessibility story,'
Can you elaborate or give some examples of that?
Are you saying that it's got a poor history for supporting features for the vision impaired or hearing impaired.
Sun 11 Apr | Michael Sica (michaelsica.com) | It all comes down to Macromedia's marketing.
Most people probably equate Flash with gaudy web site intros, stupid web sites that they can't navigate without animations and sounds flying all over the place, and advertisements.
I haven't seen tons of ads or PR (write ups by journalists in major geek outlets) touting flash as a great programmer tool.
But maybe Macromedia is waiting until these new features are more mature (read: stable) before they dump a ton of money into marketing them.
...
Another thing that I think holds it back is developer mindshare about price and learning curve. You have to either buy the Flash Authoring Environment ($700) or the Flex server (just came out) for $12,000. You also have learn how to use the Flash product! Not everyone knows about the developer centric configuration. (I didn't think it was that great, it still has a Designer feel IMO, but I didn't use it for too long. Just played with it.)
.... I wish I could pick up all these new technologies in the palm of my hand and just slam them into my head. Learning through osmosis would be so much faster. I'm still learning JSP/J2EE/Java. And quite frankly I don't have time to learn the Flash stuff....
Sun 11 Apr | Michael Sica (michaelsica.com) | Maybe I should have said, "lack of marketing".
Sun 11 Apr | Eric Debois | $12,000? Ill be darned.
Anyway, I think Macromedia have recognized that flash sites is a bad idea and are now trying to evolve the concept out of that area.
I think we will see more of the streaming media part of flash. Its the most widespread, lightweight streaming client after all.
Tell me, can you connect a flash app directly to a DB server?
Sun 11 Apr | Michael Sica (michaelsica.com) | Eric, I could be wrong. But I don't think the Flash player or the server side ActionScript can connect directly to a DB. You'd have to talk to objects on the server through Flash Remoting or Web Services. (As mentioned above the Flash player can consume Web Services.)
Sun 11 Apr | Eric Debois | Well, thats a kinda major drawback then if they are going for the VB market. As long as you are bound by HTTP statelessness you might as well use regular web stuff, and maybe spice it up with XUL or applets if you want to get that 'it looks like a real app' thing going.
VBs strenght was (in my opinion) always the gui stuff, combined with painless ODBC connectivity.
Sun 11 Apr | mystified | <>Well, thats a kinda major drawback then if they are >>going for the VB market. As long as you are bound by >>HTTP statelessness you might as well use regular web >>stuff, and maybe spice it up with XUL or applets if you >>want to get that 'it looks like a real app' thing going.
How are you bound by http statelessness? You can download all the data you need to run your application at application startup (the whole database, in xml, please!). Or you can go back to the server every time the user does anything. Or, you can take the middle path, and connect to the server when it is appropriate for your application.
The fact that http (a stateless protocol) is the way you connect to the database seems pretty irrelevent to me: it's just a communication protocol.
Sun 11 Apr | John Topley (www.johntopley.com) | 'Are you saying that it's got a poor history for supporting features for the vision impaired or hearing impaired.'
Yes, exactly that.
Sun 11 Apr | Eric Debois | mystified >>
Well, Im no protcoll expert, but as far as I can tell it means that the server can not initiate a transfer to a client even thought they are 'in session'. So, in order to get live data the client needs to continually poll the server which can potentially create a serious bottleneck.
Also, can you lock data retreived for editing and stuff like that?
Sun 11 Apr | mystified | re: XUL, it doesn't work on IE, right (correct me if I'm wrong, I haven't worked with it)? If so it's a non-starter.
re: applets, the fact that swing is the slowest, crappiest UI toolkit ever (and that java is not ubiquitously installed on browsers, and is a big-ass download compared to flash) is the reason we're having this conversation. I'm a java bigot, but even I have given up on SUN ever solving these problems.
Sun 11 Apr | mystified | http://www.metasphere.net/web_tools/18.html
Look Mom, no FCS. An interactive chat room built off of Flash XMLSockets and Perl. Server side perl script mimics Flash Communication Server to update all users of the shared event.
>>Also, can you lock data retreived for editing and stuff like that?
Good question. My impression is that one would have to implement that on the server, not in the flash client.
Sun 11 Apr | Eric Debois | Yes, well, thats kind of my point. You cant make a self contained flash app that operates directly against the DB server. I dont really know how VB is used in general, but back when I was still interested, vb apps were often made to work directly with the backend via ODBC. So, I figure that if they want to win over some of that crowd they will need that kind of functionality.
Sun 11 Apr | . | Flash will make an interesting example for a marketing course one day.
Macromedia wants to expand the market by turning it into a developer too, but Flash's designer background will always handicap it in that market.
Developer tools have to provide power and control to the developer, whereas designer tools treat the user as an idiot. Flash has not entirely escaped from that attitude.
Sun 11 Apr | mystified | Dot
We agree that this will be a great case study.
I disagree with your statement that designer UIs 'treat the user like an idiot'. They're in fact pretty hard to use and far from idiot-proof. They're just oriented towards controlling the look rather than the behaviour of a system.
Sun 11 Apr | Matthew Lock | Plain old HTML and a web server is still compelling for most web applications. The user has a much greater control over a normal web page than flash. The user can go backwards or forwards at will, they can bookmark pages, email links to friends, open different links in different tabs or pages, easy printing and previewing etc.
The other reason is that no search engine can index flash movies, so no one will be able to find them, unless they are embedded in a web page.
Im curious: How do people feel about whether spelling variable and subroutine names properly is important? Programmers often arent noted for their command of the finer points of the English (or whatever) language, and some would undoubtedly argue that one can be a great developer without worrying about such foolishness as the arbitrary correct spelling of a word. On the other hand, Ive occasionally had to modify existing code that had rampant misspellings, and it frankly drives me nuts to see things with names like Indentifier, Defintion, Catagory, and so on.
I could go on about why this annoys me personally and why I think its intolerable coding practice in general, but at this point Im mostly curious to hear what the group here thinks. Is arguing for correct spelling as futile as trying to get people to agree on tabs vs. spaces or vi vs. emacs, or is it reasonable to except a modicum of care here?
Sun 11 Apr | Philo | http://mindprod.com/unmainnaming.html
#3 is there for a reason.
Philo
Sun 11 Apr | Robert Jacobson | Yes, I always except good spelling.
(Sorry to pick on you John... you raise a good point, but the irony was just too delicious.)
Sun 11 Apr | John C. | Drat, I should've known that drinking and posting don't mix! Guess I'll have to stop posting then. ;-)
Sun 11 Apr | Mike Swieton | Mistakes are annoying in comments and such. Mistakes in function names and code can cause bugs very easily. Just spell well, it's not that hard.
Sun 11 Apr | NathanJ |
Developers should always spell variables correctly. I don't think anyone can reasonably argue against it.
Also, I hate abbreviations. Some coders like to use abbreviations, but since everyone abbreviates slightly differently I don't like it in my code.
I once worked on an application that dealt with email. The original authors were French. Most of the comments and variables were english, except 'subject' which they spell 'suject'. I thought it was a typo and merrily started fixing all the typos. So now another thing I don't like is when people mix languages.
Sun 11 Apr | Sam Livingston-Gray | Disclaimer: I'm someone who has a spell-checker built into his brain. That being said, I have yet to be disabused of the idea that anal-retentiveness, which can manifest itself as good spelling, is one of the essential qualities of a good programmer.
(Ugh. Sorry for the inversion there; I've been reading Neal Stephenson. Yes, spelling is important. Paying attention to spelling gets you in the habit of paying attention generally.)
Okay, sure, the compiler (for languages that have them) will tell you when you spell the same token differently in the same scope, but in my own experience, the ability to spell things correctly the first time seems to have a correlation to the ability to spot other coding errors quickly.
Sun 11 Apr | Kyralessa | Careful attention to detail is only called anal-retentiveness by those who are unable to manage it themselves. :)
Sun 11 Apr | H1B holder | You should always spell your code and comments correctly because Indian programmers are learn English by reading your code.
(Thats also why you need very long variables names, you cant learn english on abrv. )
Sun 11 Apr | Christopher Wells | I asked a peer to correct a mispelled class name (and I explained that "diagnoses"is the plural not the singular): he agreed willingly, and ask me to tell him if I noticed any other mistakes.
Sun 11 Apr | GD | I once had to maintain VB code that was written by someone who's english wasn't quite mother tongue... I had to actually keep developing with the misspellings because it became pretty much impossible to track through out the code.
Sun 11 Apr | no name | GD: who's -> whose
Sun 11 Apr | GD | Yeah, well i never said my mother language was english either... :)
Sun 11 Apr | Tayssir John Gabbour | Bad spelling gets baked into APIs. Errors result since we don't often have good tools that make spelling irrelevant; plus it contributes to general feeling the code is creaky.
I like programming in a language that encourages encourages sensibly long names, and even works ok with spaces in variable names.
Sun 11 Apr | Portabella | Good naming is hard, but IMO worthwhile.
I hate abbreviations too, or more correctly, I hate bad and pointless abbreviations: Bad ones are hard to figure out, Pointless ones don't save enough letters to be worth the trouble (why 'Passwd' instead of 'password')?
I also hate long names: CustomerEmailPreferencesManager is clear, but IMO quite clunky, especially when it's in code like this:
CustomerEmailPreferencesManager.getInstance().saveCustomerPreferences();
A good project for someone: write a short and sweet cookbook for good naming. Not just why bad naming sucks (we know that!), but how to improve naming on a project.
Sun 11 Apr | not me |
I find it annoying when programmers can't spell 'cat' when you spot them two letters. Having to decipher their variable and function names is like learning a second language.
But hey...let's be honest...What do you expect from an industry that is largely populated by a bunch of un-educated hacks who were too lazy to get a formal education and jumped into the industry because it was the fastest way to make a buck?
Sun 11 Apr | Stephen Jones | If you all coded in MS Word (with 'smart quotes' turned on à la Kallal) then you wouldn't have any problem.
Sun 11 Apr | GML | I worked with a guy that couldn't spell if his life depended on it. He wrote a number of useful utilities and classes for us, one of which was used so often, and was completely mispelled, that I painstakingly corrected the spelling and changed ALL occurrences of it! Talk about a PITA!
BTW, try using Word to write a story who's lead character is names Teh. It's impossible.
Sun 11 Apr | Dewd | Can't you turn off "auto-correction" for "The" at least ? :-)
Sun 11 Apr | . | I think good communications and spelling should be a basic part of any professional job.
I would be happier if people without those basic competencies were excluded from programming, just as they are from other professional jobs. (In other jobs, this occurs because only well educated people get through the preparation systems, due to constraints on supply.)
Do you do anything to indicate that a table is a lookup table? Ive always prefixed them with lu, but that always seems to raise eyebrows...
Philo
Sat 10 Apr | HeWhoMustBeConfused | Philo, why do you feel the need for distinction in the type of table?
The content of the table is expressed by its name, its role in the database is expressed by its relationships.
Just as meta data in column names is a bad thing, so is overloading the name of ANY object with 'useful' information.
Hmmmm ... does this mean you are an ardent fan of 'Hungarian' notation?
Sat 10 Apr | Philo | Because lookup tables are an strident exception to 'normal' tables - they are generally static, subject to different usage, feed dropdowns and selectors, provide lookup information for tables...
I've had utility code that built stored procedures and lookup code for an entire database. How do you suggest I identify which tables are lookups?
And yes, before VS.Net made everything an object and provided additional identification tools in the IDE, I was a strong supporter of Hungarian notation.
Why is metadata in column names a bad thing? You mean you don't put 'ID' in your primary keys?
Philo
Sat 10 Apr | Elephant | Philo:
After poking around some, it seems the general consensus regarding lookup tables is to name them in relation to their activity.
i.e.
activity_status and activity_type
I've also seen some people label their lookup tables with the 'tlkp' prefix which is even more cryptic. Doesn't seem to be any hard and fast rules though. So long as you're consistent, I don't think it should matter much. And if they're raising eyebrows at your naming conventions, put the heat on them. Ask if they can do better. If they can, great! You just learned a better way. Otherwise, they'll hush up.
Sat 10 Apr | DJ | No I don't put any prefixes on tables - don't think it is that common.
Sat 10 Apr | Egor | I too never prefix any tables. Just give them meaningful names with regard to what they hold.
Speaking of them being distinct, you never know what the future holds. Even for lookup tables. It may be relatively easy to rename a variable after its role changes, but think about renaming a table in a relatively developed application.
Sun 11 Apr | John C. | I've never felt the need to distinguish lookup tables in this fashion, though I doubt I'd scream if someone wanted to do this.
Naming standards in my experience are a little bit like code-formatting standards. It's important to have clarity and some level of agreement on fundamentals like this, but the specific approach adopted probably isn't as important as having *some* reasonable approach.
Sun 11 Apr | HeWhoMustBeConfused | I use ID in the name of a column only if the natural description of that column is 'identifier', or similar word.
Some (contrived) examples:
1. In a table of people identified by Social Security Number, the identifying column is (perhaps) SSN, not ID.
2. In a table of countries identified by ISO-3166 country code, the identifying column is COUNTRY-CODE, or simply CODE.
3. In a table where I choose to use a surrogate key, with no natural assocation with any data type, I would probably use ID as the column name.
I don't really have a problem with your approach to naming tables, it just isn't necessary. It also falls into the common trap of perspective ... the fact that a table is peripheral in your initial usage does not mean that it remains so into the future of the database.
Sun 11 Apr | HeWhoMustBeConfused | Incidentally, Philo, the reference you provided in the topic about variable name spelling some delightful comments about "Hungarian" notation. :)
Sun 11 Apr | Philo | Okay, here's my convention for any table used to contain data for a lookup:
Table name: luStatus
PK: StatusID
Nomenclature: Status
Where 'Status' is some invariant predefined list, like 'Operational, Out of Commission, Under Repair' etc.
It's a relatively fixed list of values which in the UI is probably populated by a drop-down list or radio buttons. In the data table when you see 'StatusID' you know
a) it's a FK
b) it refers to a lookup
c) that lookup is most likely the luStatus table
Yes, that can also be discovered by looking at the reference, but when you see it in code or an SP, it's self-explanatory.
Philo
Sun 11 Apr | Sam Livingston-Gray | I've used "tbl" to prefix tables and "tlk" to prefix lookup tables. It gets a bit annoying, though, to not be able to quickly jump to an item in a tables list by typing its first letter. Having to type the first four or five definitely undermines the usability of those interfaces.
Sun 11 Apr | Kyralessa | I use 'tbl' to prefix data tables and 'List' to prefix lookup tables. Examples from a medical database I did: tblPatients, tblVisits, ListMedications, ListDeliveryTypes...
Why 'List' and not 'lst'? I never thought about it much before, but it was probably because 'lst' was already taken; it's the Hungarian designation for a ListBox control.
My List tables are generally for filling ComboBoxes and keying to fields in other tables filled from ComboBoxes, and usually have only two fields: primary key and string data. Which, in ListMedications would be named KeyMedication and Medication respectively, while in ListDeliveryTypes they'd be KeyDeliveryType and DeliveryType. And so I don't have to waste much time looking up field and table names while coding.
Sun 11 Apr | Lou | I recently became a big fan of not expressly naming tables or lookup tables. Instead I like the idea of a three letter abbreviation for the table name, which is then used to prefix every variable:
JOS_Joel_On_Software (JOS_uid, JOS_id, JOS_member_name...)
When I'm coding I rarely have to expressly declare my table during a join and the code looks a lot cleaner. Of course a good IDE would help there, but I'm an SQL junkie who prefers to code by hand.
Sun 11 Apr | Stephen Jones | Why would you want to do this?
The purpose of naming objects is to distinguish them from other objects of the same name. tblQuestions as opposed to qryQuestions or frmQryquestions (link forms to queries not to tables before anybody asks).
I suppose it might be useful at first glance to be able to see which tables are simple static lists, but I would think that would be offset by the lack of agreement on a standard abbreviation.
Sun 11 Apr | Mark Hoffman |
I don't use any convention for lookup tables. I just try to give them a name that makes it easy for someone else to understand what their purpose is. I don't follow some strict guideline; I just call them what makes sense.
The problem with home-grown naming conventions is that while they may make perfect sense to the author, other programmers might not have a clue as to what they mean. In that sense, they become an obstacle to someone trying to get up to speed with your code.
Sun 11 Apr | Ryan | At my current company, we categorize these tables as 'reference data,' and prefix our tables with REF_. So we have REF_COUNTY, REF_STATE, REF_COUNTRY, etc.
The tricky part is deciding what truly counts as reference data. Generally reference data would include content which is used as read-only during most usage scenarios. But reference data does need to be updated from time to tim. (Hell, there are always new countries popping up in the world, and others disappearing.) As another example, user accounts generally aren't edited very often. Does that make it reference data?
Conclusion: the deliniation is not black and white, but really many shades of gray.
But if that's the case, how do you set the line between which tables are prefixed with 'REF' or 'LU', and which are not?
Sun 11 Apr | deja vu | I've had lengthy arguments about this topic with coworkers.. They seemed to be in favour of naming something a lookup, while I personally prefer to make each table name reflect it's content, rather than it's purpose.
The way I see it is this: if you have an employee table, you don't care if it's being used for a lookup or as a datafeed or for modifications; you just want the name to describe the sort of information it's going to have. So even if employee IDs function as a lookup, calling it lu_employee_id or something would just mean you're second guessing whoever uses the schema and telling them, look, look.. here be lookup tables :)
Having said that, I do occasionally have hashtables function as lookups in my code and I name the variables as 'lookup'_ something. Just not database tables, since I feel they can and should be used anyway you want, not necessarily named according to it's common or intended use.
Sun 11 Apr | Philo | I'm trying to examine the grey areas here - to me, almost all the time a table is a lookup or it's not. If a field has a fairly limited, established list of values that can go in the field, it's a lookup. Lookups indicate descriptors or 'types' of things - priority, color, status, etc. Things where the business organization already has a fairly fixed set of values that are 'legal' for the field.
So you normalize those values into a lookup table and put the index or code into the field.
Maybe couching it as a design question:
An application needs a field where you indicate color. There are sixteen available colors. Colors may be added or removed, but not very often.
How do you design that in the database?
Philo
Sun 11 Apr | Stephen Jones | Let's take the color thing.
The first question is is color an attribute or an entity?
If you are a paint factory then color is going to be an entity. Equally for most uses in a database, because instead of talking about 'red' you are going to be talking about a particular chemical formula of paint.
But what about those parking tickets from Philadelphia that tell you the color of the car you got a ticket on. Here it doesn't matter too much. Maybe you want to let the attendant describe the color the way he wants (do you really want him agonzing over whether a carmine colored car was red or pink?).
Incidentally there is no reason why look-up tables should only be rarely updated. If you allow the user to add to the list in a combo box, you can allow of frequent updates.
This discussion incidentally has little to do with whether to prefix lookup tables separately from other tables in Hungarian. I can see the advantage of it, since even in small databases maybe 90% of the tables are going to be lookup tables so it would be useful distinguish the others at a glance. But the problem of there being no agreed standard probably pushes the scale the other way.
Sun 11 Apr | Philo | 'But what about those parking tickets from Philadelphia that tell you the color of the car you got a ticket on. Here it doesn't matter too much.'
*************
'Hey Harry, what color would you call this car?'
'Beige'
Color: Beche
'Okay Sarge, let's see if we can find our burglar - pull a list of all the brown, tan, and beige cars that got parking tickets on that block on that day.'
'Sorry, Fred, nothing showed up'
I suspect this is closer to the truth than either of us would've guessed. My county recently added a mandatory field on auto registration forms - current color, with a list of two-letter color codes (choose the closest).
One of the reasons for providing picklists is to standardize input for reporting purposes...
Philo
Sun 11 Apr | HeWhoMustBeConfused | Your desire to control/validate the data is good. It is your naming convention that is of little value.
I've been thinking about this discussion in terms of 'could this benefit me?'. So far I can see no practical benefit, for me or any user of my schemas and code, in prefixing a table with some arbitrary 'table type'.
I can't think of any database design or modelling methodology that supports 'types' of table, which is also an indicator that this is of no benefit.
It seems to me that you are taking a short-sighted view of the database design. Perhaps you are used to working with relatively small personal or workgroup applications, from the perspective of a coder rather than a modeller. A data modeller would think about the problem in terms of the data (ie, Colour, or State), not about its usage in one particular application.
Sat 10 Apr | TomA | C'mon... if you want to know something about google...
http://www.google.com/search?q=google+search+appliance+price
Sat 10 Apr | Wayne | According to their website:
'Google Search Appliance pricing starts at $28,000 including two years of support and software updates. More information can be found on the web at http://www.google.com/appliance'
Now for my reaction:
$28,000!?!?!
Sat 10 Apr | Li-fan Chen | I doubt you'll be shock at the price when you realize how expensive it is to lose thousands of hours of work because your workers can't find that perfectly good document they wrote last year and has to be rewritten because they can't find it. Thousands of hours!!! And remember, google would be much more cooler in an intranet than an internet because there are no crazy key word spammers. Waht you look for will actually be found with a "I feel lucky".
Sat 10 Apr | somebody | How would the page rank work on a intranet? pagerank is what makes google goole and not msn search isn't it?
Sun 11 Apr | Sam Livingston-Gray | On a sufficiently large intranet, I'd expect PageRank to work just fine. On smaller ones, the results sets should be small enough to fit on a page or two.
Sun 11 Apr | somebody | I'm sorry but isn't page rank looking what pages link to the page that you are processing now?
So on an intranet, where there are mostly word documents, pdf's powerpoints and applications how is it going to know what is more populair?
IMO as pagerank doesn't work on an intranet, you can just use the indexing service of Windows 2000 and higher with maybe plug ins that understand pdf's, officefiles and that can read the metadata from files.
Sun 11 Apr | Eric Debois | somebody>>
http://www.google.com/appliance/faq.html#3
Sun 11 Apr | Philo | SharePoint!!!
The portal server has an indexing engine and a topic assistant that can provide 'best bets' based on search history.
[disclaimer: I'm a Microsoft employee, but SharePoint is still cool...]
Philo
Sun 11 Apr | www.marktaw.com | > Now for my reaction:
>
> $28,000!?!?!
http://www.sun.com/servers/
====
Midrange Servers
Server consolidation, data warehousing, data mining, OLTP, large databases, ERP
Up to 30 processors
From $54,695.00*
* Starting price based on minimal system configuration. Prices valid in U.S. only.
====
Tell me again that $28k is expensive.
Sun 11 Apr | Prakash S | Philo how much is the licensing for Sharepoint?
The CPAN rocks thread below got me thinking. Acutally Ive thought about this before, but that thread inspired me to acutally write about it.
So why should I learn Ruby/Python/XYZ-scripting-language-of-the day when I already know Perl and I have such a huge resource as CPAN?
The main argument I hear is that Perl is ugly. Well the fact is Perl can be made readable with a little bit of effort so to me that argument is very weak.
Sat 10 Apr | Almost Anonymous | I was a PERL programmer. I used CPAN modules to solve projects. I'm (still) impressed with it's power. But's not just ugly: it's strange, it's weird, it's illogical.
If that bothers you then I recommend looking to Python or Ruby or PHP. Otherwise, stick with PERL.
Sat 10 Apr | snotnose | As AC says, Perl will do anything I need it to do. But making perl clean, easy to read, and easy to understand, is *hard*.
Thay's why my scripts are all Python nowdays.
Sat 10 Apr | Ken Klose | I kinda know PHP, and its cool for system scripting and web apps but I couldn't see a way to do Windowing apps. That's why I started to learn Python. So far I like Python and it has several frameworks for windows UIs that are highly spoken of. How 'bout Perl?
Sat 10 Apr | Wayne | If you need to build a Windows UI, why not just use VB6?
OK, so you're not as *cool* as if you use Python, but I guarantee you'll get things done quicker. I don't care about being cool though.
VB is built for building GUI's. Python et.al. are just generaly scripting languages that happen to have hooks into the Win32 API available to them.
Can you even get a decent WSIWYG designer for Windows forms for those languages? (Please don't tell me that a designer doesn't make your work go faster, that's bull.)
If you have Python/Perl/etc. code that you want to use, why don't you make a standard/com DLL wrapper that the VB app could use?
Sat 10 Apr | Wayne | Furthermore, any Windows form IDE/builder for Python/Perl/etc. won't be half as good as VB's IDE since it would probably be open source and wouldn't have even half the development time invested in it.
Sat 10 Apr | Jonas B. | Perl is indeed the most universal language, imho. But it will never be as clear as an specialised language. If you code object oriented you should seriously check out Ruby. It's an awesome language with a very simple syntax. (Which is why Perl 6 will pick up some stuff from it.) Python didn't appeal to me, as I find it has the same drawbacks as Perl while being slower and without cpan. Other people have other tastes.
Sat 10 Apr | Tom Vu | I do alot of work in perl but the perl motto "there's more than one way to do it" makes for some unreadable code. I think python is easier to grasp, has a better object model, and no references (which can be good or bad).
Sat 10 Apr | $^NAME | > But making perl clean, easy to read, and easy to understand, is *hard*.
Perl lets you express whatever you want: clerity, or tersity. Just because most Perl hackers opt for tersity doesn't mean it's 'hard' to make Perl readable--it's damn easy. Just stay away from $_, use statement modifiers, import symbols by name, etc., etc.
On the subject of statement modifiers, they're one of Perl's best features. You never have write C-style crap like this:
if (!some_func())
return 0;
'if not this is true, return zero'
Perl let's you say exactly what you mean:
return unless (some_Func());
Sat 10 Apr | T. Norman | 'The main argument I hear is that Perl is ugly. Well the fact is Perl can be made readable with a little bit of effort so to me that argument is very weak.'
Do you work alone or with a crew of highly capable programmers who believe in writing readable code? Or do you work with mostly average programmers who have the attitude 'it works, I don't care'? If it's the latter, you'll be better off with something other than Perl.
Yes, one can write ugly code in any language, but some languages encourage ugly code more than others.
Sat 10 Apr | Egor | The 'problem' with Perl is that it puts a lot of responsibility on the programmer. You have grow up professionally to a certain point to be able to take responsibility, and many occasional or hobby programmers never will.
Speaking of reading others code, I get to see *a lot* of code written by others. And it's always very nice for me to know that the system I'm going to fix/modify is written in Perl. A much better chance the original developer knew what he was doing.
Learn Python or PHP to get your feet wet with scripting, then learn Perl to get real work done effeciently. I'm glad I did.
Sat 10 Apr | deja vu | Well, for my view.. Perl was the first scripting language I learnt, and it's probably the one I know best. For any quick hack or anything under 100 lines that I think is cool to do (quick automation, grab something off the web) Perl is my automatic choice.
I don't want code clarity then, I want to finish the job.
I know Python, I like the language.. and I'd probably use it if I had to, but it doesn't have CPAN. For me, the only reason to really use Python is wxPython. Yes, there is a Perl port, but I don't like how Perl integrates wxWindows widgets, Python does it in a much cleaner, intuitive fashion. Almost anything else in Python is replaceable with Perl.
For UI stuff on Windows, I use C#. I have never learnt VB, and I can just barely read Basic code. I played with Delphi a bit, if I really had to, I'd use it too, but C# serves my (admittedly modest) needs in the UI area.
For everything else... there is Java :)
Sat 10 Apr | deja vu | err.. one addendum. For anything webby, I'd consider Perl (mod_perl or CGI), PHP and servlets, depending on many factors. I haven't used PHP outside a webserver yet. Not sure if there is a need for it, for me.
Sat 10 Apr | Likes long walks, short piers | REBOL, folks. REBOL. (look it up)
Sat 10 Apr | fool for python | Use watcha know. Unless there's the slightest chance that someone else will ever have to understand your code. In that case, use watcha know unless it's perl ;-)
Forth rules.
Sun 11 Apr | Andrew Burton | 'So why should I learn Ruby/Python/XYZ-scripting-language-of-the day when I already know Perl and I have such a huge resource as CPAN?'
Speaking as JAPH, I think learning other languages is a good (and required) thing for several reasons:
1. Learning other langauges can show you other ways to do things, and teach you new ways to think. Learning various ways to do things is wjhat Perl is all about.
2. Learning other languages makes you more valuable to an employer (or potential employer). It shows you're ready to learn things, aren't afraid to learn new things, and will even learn new things on your own time.
3. Learning other languages can help you understand Perl things better. Playing with Tkinter opened my eyes to a couple of things with Perl/Tk. Dabbling with Common Lisp taught me a few new ways to look at arrays and hashes.
There's more reasons, but those are my favorites. Just remember, it's easy to say, 'All I need is Perl' today. However, who knows what you'll need a few years from now.
Sun 11 Apr | Matthew Lock | I never bought the argument that perl is ugly. I've yet to see a language which makes building a 2 dimensional array prettier than:
my @matrix = (
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
);
or a language that makes declaring a hash of hashes prettier than this:
my $users = (
matthew => {
age => 29,
country => Australia
},
bob => {
age => 25,
country => UK
}
);
It it would be even prettier if I could use a monospaced font here!
Sun 11 Apr | Matthew Lock | Whoops the above should read my %users = (...
Not enough coffee!
Sun 11 Apr | Matthew Lock | I am also addicted to this perl feature. You can use symbols other than quotes if it's incovenient.
For example instead of:
my $html_string = '';
I can go:
my $html_string = qq{};
Now to me, that makes for a pretty piece of code.
Sun 11 Apr | son of parnas | Mathew, you could also use single quotes so you
wouldn't need to escape the double quotes.
Sun 11 Apr | Dewd | Matthew,
With Ruby:
matrix = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
users = {
:matthew => {
:age => 29,
:country => 'Australia'
},
:bob => {
:age => 25,
:country => 'UK'
}
}
The scope of the variables can be changed with @, @@ and $ depending if you want them to belong to the object, class or global variable, respectively.
The hashes can have any object as key. I used 'symbols', as they are internalized strings (only one copy of the string is stored).
The Perl version has a little edge in its hash creation, but I think Ruby's is not bad as well.
Sun 11 Apr | Dewd | With Ruby:
html_string = %q{}
Sun 11 Apr | Giovanni Corriga | No wonder that some say that Ruby is Perl done right.
Sun 11 Apr | Matthew Lock | Alrighty! How about this insert query for pretty:
$dbh->do( qq{
INSERT INTO users ( name, address, phone, email )
VALUES( ?, ?, ?, ? )
}, undef,
$name, $address, $phone, $email
);
AND perl's DBI will autoescape the variables to be substituted so there's no chance of an sql-injection attack.
For the record I have nothing against Ruby. I'm just trying to demonstrate that the freedom Larry Wall gave with the perl syntax means you can make some extremely pretty looking programs.
Scenario:
------------
The protected mode is Causeway 32Bit DOS-Extended environment. There is call _go32_dpmi_simulate_fcall which helps to execute real mode FAR calls from protected mode.
Sample code:
----------------
@example
_go32_dpmi_registers r;
r.x.ax = 47;
r.x.cs = some_segment;
r.x.ip = some_offset;
r.x.ss = r.x.sp = 0;
_go32_dpmi_simulate_fcall(&r);
printf(returns %d\n, r.x.ax);
@end example
CS and IP indicates address of the call. The CPU registers are loaded from the structure located by r.
The Problem:
----------------
What we have to do if we need to pass parameters for the FAR call ( which is given in CS:IP ) ?
A solution for this will be well appreciated.
References:
---------------
http://www.devoresoftware.com/cwwman/page_48.htm
http://eprom.myetang.com/intr/rb-5800.htm
Thanks!
Sat 10 Apr | Christopher Wells | Normally when you 'pass parameters' you pass them on the stack. These ...
r.x.ss = r.x.sp = 0;
... imply to me that you have no control over what's on the stack of the function you are calling.
If you have a small number of parameters to pass, you could try passing them in registers (e.g. r.x.bx, r.x.cx, r.x.dx, r.x.di, r.x.si).
Another possibility might be to write your parameter values into a global variable: a structure at some address in real-mode memory.
Disclaimer: I don't know _go32_dpmi_simulate_fcall and I didn't understand the References you gave.
Sat 10 Apr | Patrik | By reading up on the DPMI stuff you supplied, you could try the following:
Use GetMemDos to allocate a number of paragraphs you need; paragraphs are 16 byte chunks if memory serves correctly.
Here are the docs for that call
AX = FF21h
BX = number of paragraphs to allocate
Return:CF clear if successful
AX = real-mode segment of allocated block
DX = initial selector for block
CF set on error
If you set up say 64 paragraphs (1K) of conventional memory to be used as your real-mode call stack and pass that in as SS:SP of the DPMI real mode call structure.
By setting the SP to 0, DPMI allocates a stack; but try to pass your own allocated memory in the SS:SP struct.
Sat 10 Apr | Patrik | I dont know how much parameter data you need to send, your post doesn't say. However by moving the parameter data to the real mode memory and set SP accordingly, you should get a usable stack frame.
I think SP gets decremented; it works in a top down fashion if Im not misstaken, so you have to move your parameter data in the correct order and set SP to the highest address for POP to work correctly in your real mode routine.
Sat 10 Apr | Patrik | Sorry...
It should read...*set SP to the lowest address*
Who said assembly programming is hard? :)
Sun 11 Apr | Cherian Nair | Thanks a lot for the responses. I got something to try.
Sun 11 Apr | Cherian Nair | Number of arguements varies.
Borland just notified its CodeWright customers in an e-mail that the software has been discontinued. Existing support contracts will be serviced but there will be no new development. Nevertheless, they still _sell_ CodeWright licences... huh?
This comes as a bit of a surprise since they had produced a new CodeWright for .NET version soon after acquiring the software from Premia. Guess its getting harder and harder to compete against Visual Studio on one hand and the myriad of free/cheap editors on the other.
Anyway, this was one of my favorite programmers editors and I thought others might be interested since many here are weird enough to become emotionally attached to their tools. ;)
Sat 10 Apr | Knowledge Seeker | Probably cutting-down their competition?
Sat 10 Apr | HeWhoMustBeConfused | Perhaps Borland is to become the SCO of the developer tools market. Stop making anything of value, get rid of everyone but the lawyers, and start pushing writs out the door.
Dreams aside, it is really sad to see the death of a once great software company, especially when there is STILL a market for good, low-cost, easy to use, development tools.
Sat 10 Apr | Fred | Hopefully, they'll do like they did with Interbase, and release the code as open source instead of just killing it, so at least someone can try to keep developing it.
Sat 10 Apr | Tony Chang | Codewriht has been by favorite editor. i guess the fact it had cot sold to Borland escaped me.
It is quite obvious that, since CodeWright was much superior to the comparatively crappy Borland editor, Borland bought it with the only intention of destroying the product and creating a monopoly for themselves.
The Borland of old does not exist. All its key members have left to microsoft. Let's show our support for the Borland of old by boycotting Delphi and using exclusively microsoft products.
Sun 11 Apr | Tim Sullivan | >Borland bought it with the only intention of destroying the product and creating a monopoly for themselves.>
Ah, yes, the unstoppable Borland juggernaut with their monopoly on editors, printing money faster than anyone can count it.
Please.
I suspect that the reality was that the market for a 'better' editor was slim to none, and Borland bought it for reasons other than to sell it.
Sun 11 Apr | no name | 'it is really sad to see the death of a once great software company'
Companies cannot be great. Great products come from great people. When those people go, so goes every shred of the greatness.
Sun 11 Apr | Dobie | Borland: eliminating editors, one at a time. Y'all remember they bought Brief, then discontinued that (to make room for CodeWright perhaps, but IIRC there was a good separation in time). I believe Visual SlickEdit is a small company, might they be next?
Why is it that programmed _text_ content are not copiable *everywhere*? Notable exeptions include Message Boxes, (albeit pre-2K and even then a clumsy key combination. XP seems to support a simple ^C), Window Titles and Button Labels. When something can be put in, it should be able to take it out as well. Right?
Sat 10 Apr | Julian | Here's the case that annoys me the most. After a file search in Windows Explorer, you can't copy the name of the directory containing one of the files.
Sat 10 Apr | Tony Chang | I agree it should all be copiable.
Sat 10 Apr | Eponymous | There are many utilities that add 'copy path' onto the Windows Explorer context menu. Google 'context menu copy path' or 'right click copy path' for them.
I'd post a link to the one I use but I can't for the life of me find it.
Sun 11 Apr | one meeeellion dollars! | Borland Delphi's dialog boxes allows you to Copy it to clipboard.
Score one for Delphi.
Sun 11 Apr | Roose | It works for a lot (all) windows dialog boxes:
Try Start->Run->Enter '\\a', and then hit Ctrl-C, then you get this when you paste it into a text editor:
---------------------------
\\a
---------------------------
\\a
The network path was not found.
---------------------------
OK
---------------------------
[I posted this in Ask Joel, and decided to post it here to get more feedback. If there are any finance nerds out there, read on and let me know what you think.]
There are two problems with expensing stock options:
(1) The expense will vary over time as the stock price changes
(2) The value of an option may have nothing to do with the actual cost to shareholders.
Lets look at an example using Ciscos 2003 stock price:
Imagine that in January of 2003, when Cisco was trading around $15, Cisco granted 100 options to various employees with each option having a strike price of $30. Lets say that these options expire in five years, that is these are January 2008 options, and they vest in two years. Therefore, the employees would only be able to exercise between January 2005 and January 2008.
Using a Black-Scholes calculator and entering in some educated guesses on volatility and interest rates, we get back a value for each option of around $4. Cool. Cisco then subtracts $600 from its balance sheet as an options expense.
So, heres where Cisco stands in January 2003:
stock price: $15
options granted: 100 (Jan 2008) with a strike price of $30
options expense: $4 x 100 = $400
In January 2003, Cisco is showing an expense of $400 that hasnt actually occurred. Cisco has not spent $400. They have merely granted their employees some options that may or may not eventually be exercised that were valued at $400.
Now, lets fast forward to January 2004:
Cisco has rocketed to $25. We run our Black-Scholes calculation again and find that the employee options are now valued at around $9. Hooollly Jesus! Does Cisco have to subtract another $500 from their balance sheet just because their stock price has gone up? That seems insane. And what if Ciscos stock price had went to $10 or $5. They could add back income to their balance sheet.
All of this balance sheet chicanery would occur without any money changing hands. And, if Ciscos stock price does not rise above $30 before January 2008, all of the options expense would have to be added back to the balance sheet because no actual expense would ever have occurred.
Its also important to note that in-the-money options that dont correspond to actual shares are included in the diluted earnings per share calculation. Therefore, the expense would also need to be backed out once Cisco rises above $30, otherwise the expense would both subtract from the e (earnings) and add to the p (price) in the P/E. It would count as a double-whammy against the corporation when it should at most be a single-whammy.
That pretty much covers point (1) above. Now, lets examine point (2).
Why should investors even care about the value of employee stock options? Answer, they dont, or at least they shouldnt. Warren Buffett likes to argue that options should be expensed because the corporation is essentially giving away a benefit without showing an expense on the balance sheet.
It is true that options are a benefit and they may end up diluting the shareholder base, but it is also true that the options may end up costing shareholders nothing. But notice, that in any event, the option will never actually cost the company money. If the option is exercised, it will merely result in the issuance of more shares. The result is a dilution of earnings, not an actual expense.
For example, a company with $10 in earnings and 100 shares priced at $1 each has a P/E of 10. If this company then grants employees 10 options that are exercised, there will be 110 shares outstanding giving the company a P/E of 110/10 = 11. This is the only way that options will affect a company. There will never be an actual expense; there will just be some additional number of shares issued which results in diluted earnings and a higher P/E.
Because there is no expense involved, what we need is not the Black-Scholes option valuing formula, but a formula that gives us a likely number of shares outstanding given the current number of out-of-the-money options outstanding using the present and historical stock prices (in-the monies are already included on a 1-for-1 basis).
Lets see if we can come up with some type of formula that will do this for us. What would this formula need to do? Well, it needs to give us a percentage factor that we can multiple by the number of out-of-the-money options to give us a pro-rated number of shares outstanding. If the formula spits out 50%, this would mean that there is a 50% chance that the options will eventually be exercised in the money. So, if there were 100 out-of-the-monies outstanding, we would multiply by 50%, giving us 50 shares that we should add to the outstanding shareholder base.
This formula would be very similar to the Black-Scholes formula, but instead of giving us an option value, it would give us a likelihood that the option would get to the money before it expires.
I dont know much about the Black-Sholes model, so I dont know how to convert it to the type of formula I want, so for my purposes, Ill just use the option value as computed by Black-Scholes over the stock price to give me a factor that I will use in an example below.
Well use Cisco again, and assume 1000 shares outstanding.
In January 2003 we have:
stock price: $15
shares outstanding: 1000
options granted: 100 (Jan 2008) with a strike price of $30
options expense: $4 x 100 = $400
factor: 4/15 = 0.27
So, to get the pro-rated shares outstanding, we do the following:
1000 + (0.27)(100) = 1027.
Now, instead of a magical $400 expense on the balance sheet, we have increased the number of shares outstanding based on the likelihood that the outstanding options will eventually be exercised in-the-money. This keeps unnecessary, confusing expenses off the balance sheet and puts the cost of the options where it may eventually end up: expanding the number of shares outstanding.
Now, lets look at January 2004:
stock price: $25
shares outstanding: 1000
options granted: 100 (Jan 2008) with a strike price of $30
options expense: $9 x 100 = $900
factor: 9/25 = 0.36
pro-rated shares outstanding: 1000 + (0.36)(100) = 1036
If Cisco had earnings of $100 in January 2003 and January 2004, we would get a diluted P/E of 1027/100 = 10.27 in January 2003 and a diluted P/E of 10.36 in 2004. Under this scenario, options would still be expensed, but the expense would show up where it belongs, in the P/E and in the diluted shareholder base, not on the balance sheet or income statement.
Sound reasonable?
Sat 10 Apr | grunt | Yaaaaaaaawwnnnnnnn!!!!!!!!
Have you seen the title of this forum? It says 'Fog Creek Software'... !!*SOFTWARE*!!
I couldn't care any less about stock options or expensing them...
I am suprised and disappointed Joel replied at all.
This forum is getting out of hand.
Sat 10 Apr | no name | I posted this in the other forum too. It is actually an interesting topic for software developers because, according to James DeLong, it's a useful way to reward intellectual property and the people who create it.
He says the move to expense options is actually politically motivated, and essentially represents an attack on staff.
http://cei.org/gencon/025,03055.cfm
In case you're wondering, I have no connection with DeLong. It's just that whenever I see allegations of political motivation in scenarios involving lots of money, I take an interest.
Sat 10 Apr | Philo | Grunt, a quick lesson in forum lifetimes...
NewForum opens, and fairly quickly gains a crowd of people posting questions, learning on-topic stuff, etc.
As NewForum starts to mature, the initial rush of people settle downand enjoy helping new members of the community.
NewForum reaches its plateau. Now one of two things will happen:
1) The 'old hands' will stick around to socialize, have conversations, ping new ideas off each other, etc. A nice side-effect is that they're also there to help out newbies and occasional visitors.
2) Someone (either the moderator, or the group itself) will generate some manner of excluding the horrific 'off topic discussions.' Because these people simply cannot manage a delete key (and by the way, this argument was dubious on mailing lists and CompuServe. When it's on a web based forum you really have zero excuse), they don't want anyone talking about anything except what they want to read.
Yes, read. Oddly enough, I've found that with a few exceptions, often the loudest voices about signal/noise are people who don't post.
Anyway, they put a forum gestapo in place. Net result - since the 'old hands' can't talk about what they want to talk about, and have no interest in the FAQ's (which are all that are now on topic), they leave. So you end up with a boring tech assist forum full of churn. It might be an okay place to go to ask 'how do I connect my web page to a database' but you'll rarely get a full response to 'what is the best way to design my application.'
I tend to favor the former, and have seen a lot of good communities destroyed by the latter. If you don't want to read about stock options, here's a thought - don't click on that link.
Philo
Sat 10 Apr | Anon-y-mous Cow-ard | BTW, I've got this '99 Ford Taurus thats making a klunking noise when you turn left. You guys have any idea whats causing this.
TIA,
AC
Sat 10 Apr | Simon Lucy | Physics.
Sat 10 Apr | grunt | Philo,
I have the right to express my thoughts and feelings as much as you and the poster of this thread. I do not like or want to be on the sidelines as you suggested if I don't like something.
As a matter of fact, what you suggested is the very problem of this country (USA in this case). People say they dislike (or hate) this and that, but when time comes to *show* it (i.e. vote), there is noone around to say anything. That kinda crowd is doomed and deserves to get whatever it is they are complaining about.
Sat 10 Apr | Philo | Grunt, where did I say you couldn't express your opinion? You said what you thought, I disagreed and explained why.
Philo
Sat 10 Apr | no name | > I've got this '99 Ford Taurus thats making a klunking noise when you turn left. You guys have any idea whats causing this.
Yes. Try examing the rubber sleeves over the suspension arm. On our car, it became cut by road debris, letting water and dirt into the steering arm.
Sun 11 Apr | Will | Back on topic...
I'm not enough of a finance nerd to comment on the details of your post, but companies need some type of cost for options. While options may have been trumpeted as a way to spread the wealth among the staff, they've been used excessively as part of CEO compensation.
While not the only reason, stock options have been a significant incentive for aggressive managing of earnings (and manipulation of stock price) in some of the worst financial scandals of the last few years. It's clear to me that the ability to issue options without any cost has led to their overuse.
On the other hand, the downside of expensing stock options occurs in private companies without any liquid market for stock. Their, options are 'if we go public' bets designed to encourage employees to grow and reward them when they are successful. (although the notion that an IPO=success can be rather dubious). Creating an artificial cost for stock options assigns a real value for paper money that may just not make sense.
Sun 11 Apr | John C. | I don't necessarily agree that expensing stock options is a good idea, or that Black-Scholes is the right way to value options even if so. (Frankly I don't understand the issue well enough, and I do worry about the effect it would have on startup companies.) But I do want to comment on what seem to me to be mistaken assumptions in the original post.
'All of this balance sheet chicanery would occur without any money changing hands.'
That's kinda how accrual accounting works under normal circumstances anyway. If you sell a product in July but your customer doesn't pay you until January, you book the revenue in July, even though you didn't get any cash until the following year. Or take depreciation, where you spend a bunch of money on an asset but spread the expense over a number of years for accounting purposes.
'For example, a company with $10 in earnings and 100 shares priced at $1 each has a P/E of 10. If this company then grants employees 10 options that are exercised, there will be 110 shares outstanding giving the company a P/E of 110/10 = 11. This is the only way that options will affect a company. There will never be an actual expense; there will just be some additional number of shares issued which results in diluted earnings and a higher P/E.'
All things being equal, you'd expect the issuance of 10% more stock to reduce the stock price by about 10%. Otherwise companies would have discovered the financial equivalent of a perpetual-motion machine: We're worth $1 billion today, but if we do a 2:1 stock split, we'll suddenly be worth $2 billion! Sorry, when you double the amount of stock outstanding, you halve the price per share. P/E is a derived measure that stays constant because both price and earnings have changed by the same factor.
And while dilution may not cost the 'company' anything, it certainly costs the *shareholders*, because their stakes are now worth less than they were.
Sun 11 Apr | Ankur | Of course they have to keep updating the expense account as the stock price changes and the Black-Scholes equation changes.
It's called 'Mark-to-Market', and it's what a company has to do for their liquid securities anyway.
Sun 11 Apr | Dino | 'That's kinda how accrual accounting works under normal circumstances anyway...'
Kind of, but not really. Booking revenue before the company actually receives it and depreciation both involve transactions that have already occurred. The company has either contracted to receive payment or has bought something and is spreading out the cost.
Option grants only involve potential transactions and the company will not actually spend any money if the option is exercised.
'Sorry, when you double the amount of stock outstanding, you halve the price per share. P/E is a derived measure that stays constant because both price and earnings have changed by the same factor.'
Option grants do not involve the actual issuance of shares. Therefore, the granting of an option will not affect the supply and demand for the stock in the market. That is why the 'expense' of an option grant is best measured by a derived measure like P/E. Granting an option (especially an out-of-the-money option) is not the same as issuing shares. Thus, an equation that computes the 'expected' number of shares outstanding given the current stock price and stock price history that could be used to compute an 'expected' P/E would best measure the hit shareholders might take if the options were ever exercised.
'It's called 'Mark-to-Market', and it's what a company has to do for their liquid securities anyway. '
Securities owned by a company have an easily measured value based on their current price in the market. Stock options (which may never be exercised) cannot be easily valued, and in any event will end up costing the company nothing, so there should not be an expense for them on the balance sheet.
Watching The Apprentice last night reminded me of one of my pet peeves... What do people think about the value of loyalty in workplace? What exactly is loyalty?
I had a boss who flipped out when a guy left our startup and joined a competitor. He kept going off about wheres the loyalty? I kept thinking, if the guy worked for me, I why would I want him to stay if he thought hed be better off elsewhere?
Ive always thought that loyalty is evil and causes companies to collapse. Its one thing to stick with the company thats going through hard times because you believe in the products and vision, and therefore think its in your benefit to tough it out. But it seems to me, the company would not only be wrong, but foolish to expect the employees to be loyal. Respect must be earned, and continued respect should be earned continuously.
And yet, it keeps coming up, most recently when The Donald said that he was looking for loyal people. Why would someone strive to fill the organization with ass-kissers incapable of analyzing and adequatly reacting to the internal problems? Wouldnt that render the company incapable of resolving those problems?
Fri 09 Apr | Sassy | Employment is a business transaction.
- I work, you pay.
- no work, no pay.
- no pay, no work.
Loyalty is nice, but you can't buy it.
Fri 09 Apr | genius | I don't even think it's nice. I think it does more harm than good.
Fri 09 Apr | Cristian Cheran | This usage of the concept of 'loyalty' from that business manager is weak and decidedly twisted.
If he wanted loyalty maybe he should have offered better conditions in the first place (better workplace, better payment, etc) instead of waiting the apparently-not-enslaved-enough to blindly bear with him through his bad business decisions(?)
Fri 09 Apr | you're fired! | Loyalty to one's employer went out with the 80's.
Fri 09 Apr | Justin Johnson | Loyalty, as something that companies are *owed*, is a joke concept used to guilt employees into working unpaid overtime.
Loyalty, as something earned by good employees and good managers through respect, hard work, and fair reward, still exists, but rarely.
Fri 09 Apr | Bored Bystander | I disagree with one point you make, Genius. I see where you're going with this and I mostly agree, but I don't see culture of loyalty itself as the problem. The problem, as always, is how the imperative to loyalty is used or misused. Just as some love is 'wrong' - sick, jealous, twisted or manipulative.
The most common behavior that I've seen, especially in technology with its huge training and learning curve burdens, is the following. A company will constantly preach loyalty as a virtue among its employees without providing rewards proportionate to the loyalty expected. It happens in many different contexts.
A concrete example (used to happen pretty often years ago, I don't know if it still does) is the company that 'scrapes' someone off the street with minimal professional technology background, and allows them to come up to speed on the job. Generally, it's really small, underfunded tech companies doing the scraping who bet that they can acquire really cheap programmers (for instance) by simply underwriting a greenhorns' mistakes for awhile.
The problem with this practice is that such companies will sometimes find a latent prodigy who takes off, but they will not advance the employee's pay in accordance with his skill and expertise. IE, the person comes in at tech support wages, and they are expected to stay at a COLA wage progress despite the fact that their value has exploded. Right or wrong, such a person will generally find a better situation. Then, the next person who interviews for a development position with such a company will have to suffer through the bag of wind owner bitching about 'backstabbing disloyal programmers' who bolt once they learn something on company time.
Programmers are generally really 'smart' people and as such, are persecuted in the business world just like the smartest kid in the class. Being very talented (and earning the big bucks once in a while) is often regarded by the often stupid drudges in non technical career tracks as 'unseemly' and deserving punishment. All the while business usually has very, very little loyalty toward technology workers.
When I hear a lot of 'loyalty' talk, I mentally translate: the business using the term is probably a shithole and doesn't pay very well (except for the owners.) So persuasion and guilt are used instead of market pay.
Fri 09 Apr | son of parnas | Loyalty == serfdom
Fri 09 Apr | Alex.ro | >> the business using the term is probably a shithole
Bored, you are very right.
I used to work for a place that, as Peopleware puts it, you'd have to be 'sick' to work for.
Basically, every day at the office was a realization: 'yep, I need to leave this place, fast.'
Genius -- don't know what you startup is like, but a lot of places are dumps and people are *aching* to stick it to the boss by leaving.
Better pay wouldn't help really (or it would have to be hugely better). Just make it a place you'd be 'out of your mind to leave.'
Fri 09 Apr | Clay Whipkey | I would never hire someone who would say that loyalty is a bygone concept. I do agree that to use the word 'loyalty' when it is completed unmerited is ridiculous. Of course, in the case explained by Genius, if the bossman could understand why it was unmerited, the guy may not have wanted to leave in the first place.
In my startup, we recognize that this is a golden opportunity to create the near perfect environment. Everything we wish our current jobs were. We will treat each other with respect, and in turn we will expect loyalty. If one of us decides to leave because it is obviously *right* for their family, that would not be disloyalty. If one of us decided to leave, joining a direct competitor, and did so only for a bigger paycheck (we are all splitting revenues equally here), that would certainly be disloyal. If I were looking to hire someone and they disagreed with that definition, I wouldn't hire them. Period.
So maybe the cynicism towards loyalty applies to the evil corporate bosses, but don't go making that your creed, because you may alienate the best opportunities.
Fri 09 Apr | the capitalist |
Don't confuse loyalty with ethics.
An employer doesn't owe an employee anything beyond a paycheck. (Spare me all the OSHA crap for now)
An employee doesn't owe an employer anything beyond the work for the paycheck.
It works better this way. If a company needs to shed a factory because it's unprofitable, then it should do so and release those workers to be better used in the marketplace.
Likewise, if an employee finds a better job then they should leave. This doesn't mean that they screw their employer on the way out.
Your're free to leave at a moment's notice and they are free to fire you on a moment's notice. I prefer it that way.
Fri 09 Apr | Bored Bystander | I'm a bit jaded on this subject. I have heard the loudest cries of 'foul' on employee loyalty from companies that created work environments that had some horribly distorted notion of 'good place to work'. Also, the companies that preach loyalty the most fervently tend to be the places that deserve it least. It's kind of a law of physics. The companies that deserve loyalty never seem to have to make a point of it.
I've seen someone bolt from a position at a small SW vendor (not a programmer, BTW) who was on the edge of a nervous breakdown from the job's duties. The owners piously acted like the person stabbed them in the back. And have seen the equivalent at a few other places, too.
Anymore, I am like a cop: I just don't believe only one party's account of a situation. And I own an s-corp and could be in the position of a boss someday, so I do tend to see the owner and the employee's sides at the same time...
Fri 09 Apr | Kyralessa | Since I just got laid off (from a university, no less) I'm probably not the guy to ask about loyalty right now.
But since you