Does anyone honestely believe that this is a privacy issue?
I certainly do. I have a certain expectation of privacy when I'm sitting in a dark room with my wife watching a movie that may invoke some sort of emotional response. Maybe I'll look stupid when I laugh, or start crying, or start fisting my wife or something. Either way, I probably don't want someone watching.
It's ridiculous. I'm in a dark room. It's dark enough that you have to bring special equipment to see if I might be doing something ``indecent'' that people shouldn't see me doing.
[insert joke about how in Soviet Russia, movie watches you]
X = X + 1 int x=0; ++x; (let ((x 1))((setq x (+ x 1)))
You made a mistake here a lot of people make when trying to ``learn'' a new programming langauge. You simply expressed the same imperative algorithm in a non-imperative langauge.
In the first example, what's the initial value of X? Is it really good practice to be incrementing something without defining an initial value. Sure, this is safe in some languages (Eiffel, for example), but even there, you have to declare the variable before using it.
In the lisp example, nobody would ever do anything like that. There's no value in modifying a variable to increase the value. That's an implementation detail for use in a non-functional implementation of an algorithm. Something higher order or recursion based would be more natural.
That said, I've got the following macro on my scheme system for my palm (although I've never used this macro):
(macro (++ e)
`(set!,(cadr e) (+ 1,(cadr e))))
[insert someone's whining about not being able to understand the macro definition, but understanding all of the details of their C compiler]
With that, you can use (++ x) to increment the value of x in place. Like I said, though, I've never used it, I just did it before I learned functional programming because I assumed I'd need such a thing.
Which one's better? I don't know, whatever works best for your skill level. Anyone with a 6th grade education can read the BASIC, C isn't hard to learn if you can handle flowcharts, and lisp is a screwed up mess until you understand lisp, because nobody was taught math in reverse polish notation, and they don't naturally see problems recursively, that's something that comes with experience.
Based on what you've said, projects in lisp are the most difficult to maintain, and projects in BASIC are the easiest. I've never met anyone who has actually seen both in use who did not claim the opposite was true.
Hint: there's a lot more to programming than being able to have a sixth grader read a single line of code.
I'd love to solve problems using lisp, but the fact of the matter is, the performance gain is nil (pun (not intended)), and the utility is actually reduced by the fact that other people of varying skill levels have to read and understand it in a fixed amount of time.
Whatever case study produced the facts you're citing here greatly contradicts any case study I've seen.
For anyone attempting to measure the credibility of your post, the last sentence was greatly benefitial:
Humans don't like recursion, thats why nobody uses LISP or anything like it.
Personally, I don't see why people seem to think iteration and mutability is so much better an recursion over immutable structures. Recursion is functional programming is conceptually simpler because you don't have to consider state, only the particular values supplied to the function.
Of course, many languages offer the option of side-effects and iteration and all that if you want it. Perhaps you should try to understand why people who program in functional languages use recursion so much (and yeah, a lot of people do use functional programming languages).
Many of the things that I can do in java would be very hard in any other language.
I use java a lot, but I find the opposite to be true. Many things I do commonly in other languages turn out to be a burdeon in java. For example (OCaml):
let dirs = List.filter Fileutils.isdir dirent_list
Java work-alike of that (assuming a Collection of File objects):
Imagine how to do a similar thing in java. Hint: there's no lambda, so there'd have to be an interface defining a method that takes an object and returns a boolean and you'd end up using (at least) anonymous inner classes instead of lambda functions when you invoke it.
One thing I've done to make my java coding easier, though, is to build a framework for writing struts actions in jython. I can turn your average 20 line struts action into a two line jython script.
I'm no java apologist. I use a lot of different programming environments and find java frustrating in a lot of ways, but I disagree with a lot of what you said. Java is the best tool for many jobs simply because it was the best tool for many other jobs. This has caused a large class library to come about that has pre-built code for many of the things one needs to do. This makes it take less time for me to make some things (but the language still manages to make the process a bit slow and painful).
In particular:
NEVER use Java to create or manipulate graphics from the command line. No JDK, EVER, has managed to do this despite five years of pleading from the professional programmers. Without a GUI Java goes belly-up on the first "new java.awt.Frame()". (And for you 1.4+ folks who think HeadlessException was a fine solution, it wasn't.)
I've been doing headless java graphics manipulation since 1.1.6 as part of my photo album and other tools. It got a bit easier in 1.4, but it's always been possible. For example: my house temperature diagram takes the collected data and renders to PNG or GIF depending on what your client claims to accept.
What if I could make a perfect copy of your wife? Then, me and a hundred of my friends gangbang her all we want while distributing other copies of her to the rest of the world? Would you feel "ripped off" or would that constitute some type of fair use?
I doubt most people would be bothered by the ``perfect copy of your wife'' part of that concept.
Besides, my wife is a physical entity whose value isn't reduced by the existence of an identical copy. Not to me, anyway.
Last time I checked, Apple is charging more than Windows.
I just went to the first random place I could find MS software (buy.com) and looked for the price of Windows. XP Home is $186.94. According to store.apple.com, OS X is $129.00. I paid $200 for a 5-system license.
SUN charges way more for its servers than MS does for its servers.
Microsoft doesn't sell servers as far as I can tell, they sell software that runs on other people's servers. Sun sells servers.
MS SQL server vs Oracle vs IBM DB2
I've been working in a server industry in a while, and I've never heard of anyone describe those three products as being very comparable. People buy Oracle or DB2 because they need a more serious DB. That said, I'm doing my part to get postgres on that list.
Also, let's not forget that internet browsers would not have been free if it weren't for Internet Explorer.
This is just uninformed. I was using free browsers before I ever heard of Internet Explorer.
But in most cases, if you actually go the speed limit, you are assured to actually catch every light.
This is a problem I have on the way to work. If I don't go really fast after one light that always stops me, the next one will, and I'll be sitting at it for quite a while.
Perhaps it'd be better if they turned this thing around and had lights turn green when people were going a reasonable speed limit....or if they just adjust the timing so you can drive a reasonable speed on a given road and not have to stop at every light.
However, if you're writing a GUI application, the APIs are totally different.
Is GNUstep really *that* much different from Cocoa?
If so, fix that problem. The NeXT people knew how to make it fast and easy to make fast and easy GUI apps that are easy to maintain. Forget all of this graphically generate some code and wedge it in your app crap.
Eeek, I wouldn't even put my mail in a decent database. I've got a cyrus install with modifications that allow for compressed mail stores. I can read my mail with gzip and more if I need to and can easily reproduce any format from it.
I've got mail.app offlining and indexing all of the stuff as well on two machines (another just gets headers and messages on demand).
I also send out encrypted copies of the thing in batch (things that change get reencrypted).
Of course, I do the same thing for my databases at the table level, so it could be made to work. The closest I've come to doing that is using a stemming algorithm to index all of the words in all of my emails to produce a giant search database. I dropped the project when I got Mail.app, though.
While I understand your point, I think it comes down to what you do with that stuff. I like producing stuff, and it makes sense to me to spend my resources and have actual things come out of it. I write programs, make movies, make music, make pictures, etc... When I'm done, I have a work I can use for a while. Spending lots of money on games basically means you've spent a lot of time and money and got nothing but older and poorer.
Not that I'm going to tell someone else how to live, but I would feel really bad about myself if I did such a thing.
I have to say, though...I spent *way* too much on my car. At least I still like it, though.:)
If you already have the PC anyway then its gaming on a PC I already have ($0) or buying a console ($200).
I don't know how many times I've heard over the years, ``I only have a PC for games.'' Similarly, I know a lot of people who spend a *lot* of money on gaming machines, who really have no use for them outside of their games. Or at least, no use that requires that kind of power.
It's worth it to spend a few thousand dollars to have a better experience playing a couple of video games. To some of us, it's a really sad way to waste time and moneyu.
Hmm... I think I'm going to have to stick with my powerbook. It seems to have similar specs, but it smaller (about 2/3 as thick) and lighter and doesn't require me to run Windows to get all of the features.
Mine's well over a year-old, and they didn't have 802.11g when it came out, but I don't have access to any 802.11g anyway, so I don't really miss it. It does have 10/100/1000 ethernet, though.
I've also got it hooked up to an external 1600x1200 LCD via DVI as a second head. That doesn't seem to be an option, either.
I guess the point is that ``hands down best laptop'' is a bit more subjective than it sounds.
I don't delete anything I receive (minus spam). I've got all of my email I've received since April 1998, and all the email I've sent since February 1995. I've also got modifications to the cyrus IMAP server that allows it to deal with compressed mail stores.
It really doesn't end up taking up that much space (except on my Mac once it gets all synced up an indexed and stuff).
every time they download a piece of software and it doesn't run because it needs to be re-compiled on their platform. So then they go to Best Buy
Are you serious?
``This needs me to type a command before it will run. Fuck that...I'm going to the store!''
It typically takes less time to build something that it does to stand in line at Best Buy.
I mean, I'm not doubting you, but people should be aware of what they're doing here. They're trading a small chunk of time for a large chunk of time *and* money.
Last time I checked, IE still didn't do PNG transparency right.
This is so annoying to keep seeing.
IE has always handled GIF-quality transparency as well as it did with GIFs as far as I've seen.
IE *can* deal with deeper transparency with a little bit of javascript that disables the broken behavior.
IE users should expect broken behavior, anyway. It's stupid to discard advanced technology just because Microsoft isn't interested in having its users keep up.
That's probably accurate. If it's true that Ruby and Smalltalk are the same language with different syntax, then that would be why I haven't given ruby a try. The syntax looks too much like perl.
Do people think it's a good thing for a C++/Java/.NET programmer to go back to the drawing board for a few months and learn stuff like functional programming?
Absolutely. It's a tragedy to go through life as a programmer without knowing FP. The more you learn about programming in general, the better you will be a programming.
I thought about coming up with a syllabus for myself of C, Haskell, LISP and Perl
I always recommend against perl. Very few people understand perl (no matter what they tell you), and I've yet to see a significant perl program without several significant bugs because of lack of proper exception handling or ambiguity (stuff like if($var) where $var can be false on what would otherwise be considered valid input).
I'd definitely recommend python instead if you want to learn some scripting (maybe ruby if you like stuff that looks like perl, but has a more reasonable philosophy).
C, like any other assembler, is OK to learn, but shouldn't be used for much of anything except to write extentions in high level languages.
Haskell is good. OCaml is good. Scheme is a good lisp derivative that's small enough to learn pretty easily.
You might want to add smalltalk and/or objective C in there. Smalltalk is pure OO (the OO version of Haskell, if you will). Objective C is C with smalltalk-style OO. When combined with the NeXTSTEP frameworks, you can learn a lot of very useful patterns.
A big part of functional programming is programming without side effects. Learning to program without side effects can greatly help you create more stable applications.
I'd guess because implementing recursive programs on a CPU isn't very efficient. The usual technique involves pushing the parameters on to the stack on every function call, leading to a stack that's full of data that's identical or almost identical. 'Destructive assignments' (i.e. i++) inside a loop are a much better match for the CPU's architecture.
You should probably consider looking at assembler output from ocamlopt before saying stuff like this. Recursive loops are very efficient there. Although things like i++ are actually popular in OCaml, it's not necessarily done, and doesn't seem to add much efficiency.
Ah, I would say that "writing a program" by putting together other people's building blocks is not programming but code assembly. I would actually say that most "programmers" out there really don't know how to program, and that's why we have lots of the issues present today.
Um, no. Writing a program is always assembling building blocks unless you always start by writing an assembler for your target hardware.
The good programmers are the ones who assemble the correct building blocks the right way. The people who reinvent the linked list for every project are the ones who cause us the most problems (and yes, I've reinvented many linked lists in the past).
Once you break free from the mentality that you must always make your own malloc(), printf(), hashtables, trees, linked lists, etc... you can move on to higher level issues like the actual application you're working on.
how hard is it to have a system that when person A votes for Candidate X, increments X's vote-count by 1?
A system designed like this would be greatly flawed. When person A votes for Candidate X a vote for candidate X should be recorded, but the count should be a separate, reproducable event.
Does anyone honestely believe that this is a privacy issue?
I certainly do. I have a certain expectation of privacy when I'm sitting in a dark room with my wife watching a movie that may invoke some sort of emotional response. Maybe I'll look stupid when I laugh, or start crying, or start fisting my wife or something. Either way, I probably don't want someone watching.
It's ridiculous. I'm in a dark room. It's dark enough that you have to bring special equipment to see if I might be doing something ``indecent'' that people shouldn't see me doing.
[insert joke about how in Soviet Russia, movie watches you]
It's linconceivable to think nobody had come up with such a lincredibly obvious name before.
X = X + 1
int x=0; ++x;
(let ((x 1))((setq x (+ x 1)))
You made a mistake here a lot of people make when trying to ``learn'' a new programming langauge. You simply expressed the same imperative algorithm in a non-imperative langauge.
In the first example, what's the initial value of X? Is it really good practice to be incrementing something without defining an initial value. Sure, this is safe in some languages (Eiffel, for example), but even there, you have to declare the variable before using it.
In the lisp example, nobody would ever do anything like that. There's no value in modifying a variable to increase the value. That's an implementation detail for use in a non-functional implementation of an algorithm. Something higher order or recursion based would be more natural.
That said, I've got the following macro on my scheme system for my palm (although I've never used this macro):
(macro (++ e)
`(set!
[insert someone's whining about not being able to understand the macro definition, but understanding all of the details of their C compiler]
With that, you can use (++ x) to increment the value of x in place. Like I said, though, I've never used it, I just did it before I learned functional programming because I assumed I'd need such a thing.
Which one's better? I don't know, whatever works best for your skill level. Anyone with a 6th grade education can read the BASIC, C isn't hard to learn if you can handle flowcharts, and lisp is a screwed up mess until you understand lisp, because nobody was taught math in reverse polish notation, and they don't naturally see problems recursively, that's something that comes with experience.
Based on what you've said, projects in lisp are the most difficult to maintain, and projects in BASIC are the easiest. I've never met anyone who has actually seen both in use who did not claim the opposite was true.
Hint: there's a lot more to programming than being able to have a sixth grader read a single line of code.
I'd love to solve problems using lisp, but the fact of the matter is, the performance gain is nil (pun (not intended)), and the utility is actually reduced by the fact that other people of varying skill levels have to read and understand it in a fixed amount of time.
Whatever case study produced the facts you're citing here greatly contradicts any case study I've seen.
Before 1.4, I used xvfb. As of 1.4, headless awt is built-in.
For anyone attempting to measure the credibility of your post, the last sentence was greatly benefitial:
Humans don't like recursion, thats why nobody uses LISP or anything like it.
Personally, I don't see why people seem to think iteration and mutability is so much better an recursion over immutable structures. Recursion is functional programming is conceptually simpler because you don't have to consider state, only the particular values supplied to the function.
Of course, many languages offer the option of side-effects and iteration and all that if you want it. Perhaps you should try to understand why people who program in functional languages use recursion so much (and yeah, a lot of people do use functional programming languages).
Many of the things that I can do in java would be very hard in any other language.
I use java a lot, but I find the opposite to be true. Many things I do commonly in other languages turn out to be a burdeon in java. For example (OCaml):
let dirs = List.filter Fileutils.isdir dirent_list
Java work-alike of that (assuming a Collection of File objects):
ArrayList dirs=new ArrayList(dirent_list);
for(Iterator i=dirs.iterator(); i.hasNext(); ) {
File f=(File)i.next();
if(!f.isDirectory()) {
i.remove();
}
}
Similarly:
let dirs,files = List.partition Fileutils.isdir dirent_list
Java version:
ArrayList dirs=new ArrayList();
ArrayList files=new ArrayList();
for(Iterator i=dirent_list.iterator(); i.hasNext(); ) {
File f=(File)i.next();
if(f.isDirectory()) {
dirs.add(f);
} else {
files.add(f);
}
}
Another language I use a lot is scheme, which does not have partition. However, it's easy to write:
(define (partition f lin)
(letrec ((loop (lambda (l y n)
(if (null? l)
(list (reverse y) (reverse n))
(if (f (car l))
(loop (cdr l) (cons (car l) y) n)
(loop (cdr l) y (cons (car l) n)))))))
(loop lin '() '())))
Imagine how to do a similar thing in java. Hint: there's no lambda, so there'd have to be an interface defining a method that takes an object and returns a boolean and you'd end up using (at least) anonymous inner classes instead of lambda functions when you invoke it.
One thing I've done to make my java coding easier, though, is to build a framework for writing struts actions in jython. I can turn your average 20 line struts action into a two line jython script.
I'm no java apologist. I use a lot of different programming environments and find java frustrating in a lot of ways, but I disagree with a lot of what you said. Java is the best tool for many jobs simply because it was the best tool for many other jobs. This has caused a large class library to come about that has pre-built code for many of the things one needs to do. This makes it take less time for me to make some things (but the language still manages to make the process a bit slow and painful).
In particular:
NEVER use Java to create or manipulate graphics from the command line. No JDK, EVER, has managed to do this despite five years of pleading from the professional programmers. Without a GUI Java goes belly-up on the first "new java.awt.Frame()". (And for you 1.4+ folks who think HeadlessException was a fine solution, it wasn't.)
I've been doing headless java graphics manipulation since 1.1.6 as part of my photo album and other tools. It got a bit easier in 1.4, but it's always been possible. For example: my house temperature diagram takes the collected data and renders to PNG or GIF depending on what your client claims to accept.
What if I could make a perfect copy of your wife? Then, me and a hundred of my friends gangbang her all we want while distributing other copies of her to the rest of the world? Would you feel "ripped off" or would that constitute some type of fair use?
I doubt most people would be bothered by the ``perfect copy of your wife'' part of that concept.
Besides, my wife is a physical entity whose value isn't reduced by the existence of an identical copy. Not to me, anyway.
Last time I checked, Apple is charging more than Windows.
I just went to the first random place I could find MS software (buy.com) and looked for the price of Windows. XP Home is $186.94. According to store.apple.com, OS X is $129.00. I paid $200 for a 5-system license.
SUN charges way more for its servers than MS does for its servers.
Microsoft doesn't sell servers as far as I can tell, they sell software that runs on other people's servers. Sun sells servers.
MS SQL server vs Oracle vs IBM DB2
I've been working in a server industry in a while, and I've never heard of anyone describe those three products as being very comparable. People buy Oracle or DB2 because they need a more serious DB. That said, I'm doing my part to get postgres on that list.
Also, let's not forget that internet browsers would not have been free if it weren't for Internet Explorer.
This is just uninformed. I was using free browsers before I ever heard of Internet Explorer.
But yeah, Wal-Mart sucks.
But in most cases, if you actually go the speed limit, you are assured to actually catch every light.
...or if they just adjust the timing so you can drive a reasonable speed on a given road and not have to stop at every light.
This is a problem I have on the way to work. If I don't go really fast after one light that always stops me, the next one will, and I'll be sitting at it for quite a while.
Perhaps it'd be better if they turned this thing around and had lights turn green when people were going a reasonable speed limit.
yet the cops don't just pull them ALL over and ticket them - just you. After all its all about the revenue right?
Maybe because if you do that, then everyone would stop speeding and the cops would lose a source of revenue?
This is like any other hunting, fishing, etc... wisdom.
However, if you're writing a GUI application, the APIs are totally different.
Is GNUstep really *that* much different from Cocoa?
If so, fix that problem. The NeXT people knew how to make it fast and easy to make fast and easy GUI apps that are easy to maintain. Forget all of this graphically generate some code and wedge it in your app crap.
Eeek, I wouldn't even put my mail in a decent database. I've got a cyrus install with modifications that allow for compressed mail stores. I can read my mail with gzip and more if I need to and can easily reproduce any format from it.
I've got mail.app offlining and indexing all of the stuff as well on two machines (another just gets headers and messages on demand).
I also send out encrypted copies of the thing in batch (things that change get reencrypted).
Of course, I do the same thing for my databases at the table level, so it could be made to work. The closest I've come to doing that is using a stemming algorithm to index all of the words in all of my emails to produce a giant search database. I dropped the project when I got Mail.app, though.
While I understand your point, I think it comes down to what you do with that stuff. I like producing stuff, and it makes sense to me to spend my resources and have actual things come out of it. I write programs, make movies, make music, make pictures, etc... When I'm done, I have a work I can use for a while. Spending lots of money on games basically means you've spent a lot of time and money and got nothing but older and poorer.
:)
Not that I'm going to tell someone else how to live, but I would feel really bad about myself if I did such a thing.
I have to say, though...I spent *way* too much on my car. At least I still like it, though.
If you already have the PC anyway then its gaming on a PC I already have ($0) or buying a console ($200).
I don't know how many times I've heard over the years, ``I only have a PC for games.'' Similarly, I know a lot of people who spend a *lot* of money on gaming machines, who really have no use for them outside of their games. Or at least, no use that requires that kind of power.
It's worth it to spend a few thousand dollars to have a better experience playing a couple of video games. To some of us, it's a really sad way to waste time and moneyu.
Hmm... I think I'm going to have to stick with my powerbook. It seems to have similar specs, but it smaller (about 2/3 as thick) and lighter and doesn't require me to run Windows to get all of the features.
Mine's well over a year-old, and they didn't have 802.11g when it came out, but I don't have access to any 802.11g anyway, so I don't really miss it. It does have 10/100/1000 ethernet, though.
I've also got it hooked up to an external 1600x1200 LCD via DVI as a second head. That doesn't seem to be an option, either.
I guess the point is that ``hands down best laptop'' is a bit more subjective than it sounds.
Haha. Your posts roxen.
I don't delete anything I receive (minus spam). I've got all of my email I've received since April 1998, and all the email I've sent since February 1995. I've also got modifications to the cyrus IMAP server that allows it to deal with compressed mail stores.
It really doesn't end up taking up that much space (except on my Mac once it gets all synced up an indexed and stuff).
every time they download a piece of software and it doesn't run because it needs to be re-compiled on their platform. So then they go to Best Buy
Are you serious?
``This needs me to type a command before it will run. Fuck that...I'm going to the store!''
It typically takes less time to build something that it does to stand in line at Best Buy.
I mean, I'm not doubting you, but people should be aware of what they're doing here. They're trading a small chunk of time for a large chunk of time *and* money.
Last time I checked, IE still didn't do PNG transparency right.
This is so annoying to keep seeing.
IE has always handled GIF-quality transparency as well as it did with GIFs as far as I've seen.
IE *can* deal with deeper transparency with a little bit of javascript that disables the broken behavior.
IE users should expect broken behavior, anyway. It's stupid to discard advanced technology just because Microsoft isn't interested in having its users keep up.
That's probably accurate. If it's true that Ruby and Smalltalk are the same language with different syntax, then that would be why I haven't given ruby a try. The syntax looks too much like perl.
Do people think it's a good thing for a C++/Java/.NET programmer to go back to the drawing board for a few months and learn stuff like functional programming?
Absolutely. It's a tragedy to go through life as a programmer without knowing FP. The more you learn about programming in general, the better you will be a programming.
I thought about coming up with a syllabus for myself of C, Haskell, LISP and Perl
I always recommend against perl. Very few people understand perl (no matter what they tell you), and I've yet to see a significant perl program without several significant bugs because of lack of proper exception handling or ambiguity (stuff like if($var) where $var can be false on what would otherwise be considered valid input).
I'd definitely recommend python instead if you want to learn some scripting (maybe ruby if you like stuff that looks like perl, but has a more reasonable philosophy).
C, like any other assembler, is OK to learn, but shouldn't be used for much of anything except to write extentions in high level languages.
Haskell is good. OCaml is good. Scheme is a good lisp derivative that's small enough to learn pretty easily.
You might want to add smalltalk and/or objective C in there. Smalltalk is pure OO (the OO version of Haskell, if you will). Objective C is C with smalltalk-style OO. When combined with the NeXTSTEP frameworks, you can learn a lot of very useful patterns.
A big part of functional programming is programming without side effects. Learning to program without side effects can greatly help you create more stable applications.
I'd guess because implementing recursive programs on a CPU isn't very efficient. The usual technique involves pushing the parameters on to the stack on every function call, leading to a stack that's full of data that's identical or almost identical. 'Destructive assignments' (i.e. i++) inside a loop are a much better match for the CPU's architecture.
You should probably consider looking at assembler output from ocamlopt before saying stuff like this. Recursive loops are very efficient there. Although things like i++ are actually popular in OCaml, it's not necessarily done, and doesn't seem to add much efficiency.
(Can't speak for ghc, but I assume it's similar).
Ah, I would say that "writing a program" by putting together other people's building blocks is not programming but code assembly. I would actually say that most "programmers" out there really don't know how to program, and that's why we have lots of the issues present today.
Um, no. Writing a program is always assembling building blocks unless you always start by writing an assembler for your target hardware.
The good programmers are the ones who assemble the correct building blocks the right way. The people who reinvent the linked list for every project are the ones who cause us the most problems (and yes, I've reinvented many linked lists in the past).
Once you break free from the mentality that you must always make your own malloc(), printf(), hashtables, trees, linked lists, etc... you can move on to higher level issues like the actual application you're working on.
how hard is it to have a system that when person A votes for Candidate X, increments X's vote-count by 1?
A system designed like this would be greatly flawed. When person A votes for Candidate X a vote for candidate X should be recorded, but the count should be a separate, reproducable event.
Think WORM.