I've been a longtime fan of Eric Lippert's blog. And one of my favorite (albeit short-lived) post series was his Five Dollar Words for Programmers. Although I've sometimes been accused of being too wordy, I find that learning the right word to describe something you're doing is a small step on the road towards understanding and eventual mastery.
Why are these words worth five dollars? They're uncommon words that have a unique and specialized meaning in software development. They are a bit off the beaten path. Words you don't hear often, but also words that provide the thrill of discovery, that "aha" moment as you realize a certain programming concept you knew only through experimentation and intuition has a name.
Eric provides examples of a few great five dollar programming words on his blog.
1. Idempotent
There are two closely related definitions for idempotent. A value is "idempotent under function foo" if the result of doing foo to the value results in the value right back again.A function is "idempotent" if the result of doing it twice (feeding the output of the first call into the second call) is exactly the same as the result of doing it once. (Or, in other words, every output of the function is idempotent under it.)
This isn't just academic. Eric notes that idempotence is used all the time in caching functions that create the object being requested. Calling the function two or a thousand times returns the same result as calling it once.
Imagine for instance that you were trying to describe how to get from one point in an empty room to another. A perfectly valid way to do so would be to say how many steps to go north or south, and then how many steps to go northeast or southwest. This hockey-stick navigation system is totally workable, but it feels weird because north and northeast are not orthogonal -- you can't change your position by moving northeast without also at the same time changing how far north you are. With an orthogonal system -- say, the traditional north-south/east-west system -- you can specify how far north to go without worrying about taking the east-west movement into account at all.Nonorthogonal systems are hard to manipulate because it's hard to tweak isolated parts. Consider my fish tank for example. The pH, hardness, oxidation potential, dissolved oxygen content, salinity and conductivity of the water are very nonorthogonal; changing one tends to have an effect on the others, making it sometimes tricky to get the right balance. Even things like changing the light levels can change the bacteria and algae growth cycles causing chemical changes in the water.
Orthogonality is a powerful concept that applies at every level of coding, from the architecture astronaut to the lowest level code monkey. If modifying item #1 results in unexpected behavior in item #2, you have a major problem -- that's a form of unwanted coupling. Dave Thomas illustrates with a clever helicopter analogy:
It sounds fairly simple. You can use the pedals to point the helicopter where you want it to go. You can use the collective to move up and down. Unfortunately, though, because of the aerodynamics and gyroscopic effects of the blades, all these controls are related. So one small change, such as lowering the collective, causes the helicopter to dip and turn to one side. You have to counteract every change you make with corresponding opposing forces on the other controls. However, by doing that, you introduce more changes to the original control. So you're constantly dancing on all the controls to keep the helicopter stable.That's kind of similar to code. We've all worked on systems where you make one small change over here, and another problem pops out over there. So you go over there and fix it, but two more problems pop out somewhere else. You constantly push them back -- like that Whack-a-Mole game -- and you just never finish. If the system is not orthogonal, if the pieces interact with each other more than necessary, then you'll always get that kind of distributed bug fixing.
3. Immutability
Immutability is a bit more broad, but the commonly accepted definition is based on the fact that String objects in Java, C#, and Python are immutable.
There's nothing you can do to the number one that changes it. You cannot paint it purple, make it even or get it angry. It's the number one, it is eternal, implacable and unchanging. Attempting to do something to it -- say, adding three to it -- doesn't change the number one at all. Rather, it produces an entirely different and also immutable number. If you cast it to a double, you don't change the integer one; rather, you get a brand new double.Strings, numbers and the null value are all truly immutable.
Try to imagine your strings painstakingly carved out of enormous blocks of granite. Because they are -- they're immutable! It may seem illogical that every time you modify a string, the original is kept as-is and an entirely new string is created. But this is done for two very good technical reasons. Understanding immutability is essential to grok string performance in those languages.
I don't pretend that these three words are particularly unique or new, just a tiny bit off the beaten path. They were, however, new to me at one time, and discovering them marked a small milestone in my own evolution as a programmer.
What's your favorite five dollar programming word? And how did it help you reach that particular "aha" moment in your code? (Links to references / definitions greatly appreciated in comments -- perhaps we can all discover at least one new five dollar programming word today. Remember, learn four and you'll earn a cool twenty bucks worth of knowledge!)
Cruft
Developer Dude on March 20, 2009 10:03 AM@Chas.Owens - I was dreading Discrete Math, but it turned out to be the best/most fun math class I ever took. All of the graphing theory and set theory really cleared up a lot of things. When you have a concise set of vocabularies to describe very specific relationships,it becomes a lot easier to understand those relationships. That class was nothing but $5 words......
FWIW: GEB is one of my all time favorite books.
Another $5 word making the rounds these days, Ontology
jmcecil on March 20, 2009 10:04 AM@Dave
erinaceous? of, pertaining to, or resembling a hedgehog? I am afraid to ask what field you work in that you find that a useful word to have on tap.
Chas. Owens on March 20, 2009 10:10 AMIt did happen to me when I was undergoing training about design patterns and I was surprised to know that many patterns which I already used has a name such as Factory, Builder, Proxy etc. Though I did use those with little variations.
I wonder whether the name is actually important. You just need to know what is right and obvious choice for a given problem and it just comes from within.
I'm idempotent, you insensitive clods.
Walter on March 20, 2009 10:20 AMbrevity
irrelevant on March 20, 2009 10:37 AMA good example of a non-trivial idempotent function is set insertion or deletion.
If you start with an empty set {} and then insert 1 into it, you get the set {1}
If you take the set {1} and then insert 1 into it again, you get the result {1} again.
So the set-insertion function is idempotent.
andy on March 20, 2009 10:41 AMHere 's a 5$ word that language nerds should know:
homoiconic - when describing a programming language, means that the primary representation of programs is also a data structure in a primitive type of the language itself.
andy on March 20, 2009 10:51 AMI have found that me knowing a specific word with the context and nuance it brings does not guarantee my counterparty knowing the word. Even more so in international organisations where English is often a second language.
It is more a of a skill when you know a word, say it, and then proceed to concisely explain its meaning.
Stijn on March 20, 2009 10:55 AMWhen peers were reviewing my code, I heard this word a lot: dubyatief. After learning that it was WTF and what it meant, I've downgraded it from a 5-dollar word to only 2 cents.
MC on March 20, 2009 10:59 AMGarbage Barge - When a class contains junk functions at the same time fail to meet it's functionalities.
Sarat on March 20, 2009 11:01 AM
Bifurcation, or for those of you that don't like binary trees, try
trifurcation...
NP-complete works everytime.
When I finally learned what a *Closure* was, that blew my mind. It makes code much more expressive and power... it also made me hate Java for not supporting them ;)
On the other end, we have useless marketing terms like ajax, that sales people use to try and sell junk software to business people.
bgsu_drew on March 20, 2009 11:14 AM1.) Closures. Like a couple others, this was a big aha moment for me. Once I understood closures, languages like Ruby and JavaScript suddenly opened up to a whole new dimension. Event handling and callbacks in JavaScript becomes much more concise when you know how to use a closure. My favorite article that describes closures is by Paul Graham: http://www.paulgraham.com/icad.html and is the section about accumulators (Appendix: Power). That section helped me have the aha moment.
2.) Duck typing. I don't really have a link, so.... http://en.wikipedia.org/wiki/DuckTyping (aaaah, Wikipedia... the default reference link). I learned closures and dynamic languages at the same time, and to this day I feel duck typing makes closures significantly more expressive and useful. I've seen the closures proposals for Java... as much as I would love to be able to use closures in Java, they are just so verbose and clunky compared to the dynamic language counterparts (at least in my opinion).
Mike Stone on March 20, 2009 11:15 AMMine is 'fuck'!
I use it a lot whilst programming.
Bob on March 20, 2009 11:30 AMInvariant, especially when prefixed by class or loop.
Also the less well-known variant. A loop variant is the expression which changes value on each iteration of the loop. If nothing changes, you have an infinite loop. Expressing variants explicitly can help prove that a loop does in fact terminate, and checking variants at runtime can help detect bugs that hang (as opposed to core-dump).
I first encounted these ideas in an early book on the Eiffel programming language.
Dave Harris on March 20, 2009 11:38 AMA word that came up for me this week is sargable.
It applies to a SQL query condition that can take advantage of an index to speed up the query.
Bill Karwin on March 20, 2009 11:47 AMRed Herring - describes an all-too-common experience when debugging, but once you discover something is a red herring, you've vastly increased your understanding of the problem.
Googlophobia on March 20, 2009 11:49 AMNow this is *popular* content. Thanks :)
Mine is Patterns
They wont say method, system, methodology, practice, procedure, tactic or strategy. They wont state the problem of managing the software in simple words. They'll invent a new pattern and market it as the direct path to Nirvana.
But once the word was familiar, it was mundane and obvious. But I hated the class divide when the guys knew something great if they knew what a pattern was. Then i found out.
happyisme on March 20, 2009 11:51 AMVery interesting, but you must know some math to do it right.
MarryMe on March 20, 2009 12:09 PMcatamorphism
JimDesu on March 20, 2009 12:12 PMObviously, one word uncommon in software development circles - but very valuable - is education
*All* those five-dollar-words are part of decent education in computer science. Yes, I understand not all of us have a degree - but if you're serious about your craft, you should at the very least take a look at all the publicly available classes from Stanford and MIT.
Seriously - it will make your live *much* better.
Rachel Blum on March 20, 2009 12:40 PMI'm a code monkey writing spaghetti applications!! And I admit it!! What can I do about it? Nothing, or else I should switch jobs. At least I get paid for putting in lines of code in a spaghetti app...
Could be worse. I despise those architect astronauts who get paid astronomical amounts of money and put in little actual value in code, fuck them hippocritical bastards!!!
Metacircularity!
Ken on March 20, 2009 1:09 PMMetacompilation/metacompilar. Sorry, I'm a Forth dude. :-)
Extensibility. We (the functional world, mostly) are still waiting for our unenlightnened brothers to catch up. :-) Then again, extensibility is exactly what many DO NOT want, so I not betting on that one.
But, to be honest, I have this very old book about Programming Languages. It's full of concepts -- such as orthogonality -- on which languages can be evaluated. I'm sure there's still such books around, if only because it's basic material for any theoretical computer language design course. At any rate, these concepts where usually expressed as a single word, and they were ALL 5-dollar words.
So, if you like such stuff, do try to find a computer languages theory book.
Daniel on March 20, 2009 1:18 PMI'm a fan of isomorphic as well :) It's a fancy way of saying, these two things are basically the same. It doesn't matter which one you choose. I used the word colinear in a meeting the other week (then again I do a lot of UI/graphics work).
Coalesce is a good one. a href=http://en.wiktionary.org/wiki/coalescehttp://en.wiktionary.org/wiki/coalesce/a">http://en.wiktionary.org/wiki/coalesce/a">http://en.wiktionary.org/wiki/coalescehttp://en.wiktionary.org/wiki/coalesce/a . It comes up in C# with the ?? operator, and also a lot in computer graphics. For example, if I am rasterizing the interior of a polygon (essentially, a function from Point[] - Int32Rect[] which approximates its interior for a given transformation), my outer loop goes by 1 pixel on the Y axis. I'd rather emit a rectangle that's 10 pixels tall than emit 10 rectangles that are 1 pixel tall (all with the same X left/right coordinates). It's basically run-length encoding of data in order to unroll data-driven loops, and conserve memory. This is very important when sending those rectangles to, e.g., GDI, because the performance is very sensitive to the number of GDI function calls you make. One call to draw a very tall rectangle is substantially cheaper than many calls to draw smaller rectangles that visually result in the same pixels on-screen.
A lot of the work I've been doing lately has centered around functional, asynchronous, and concurrent programming, as well as graph theory, so the related nomenclature has been prevalent for me.
Understanding the meanings of and relationships between closures, first-class and higher-order functions (and partial derivatives!), immutability, and how they can all facilitate async/concurrent programming via continuation passing style ... it's wicked :)
They are a bit off the beaten path. Words you don't hear often, but also words that provide the thrill of discovery, that aha moment as you realize a certain programming concept you knew only through experimentation and intuition has a name.
You said it perfectly. The first time I picked up the Design Patterns book was after I'd been amateur/student hacking in C++ for a few years. For almost every pattern I said, Oh! I've totally done that!
Rick Brewster on March 20, 2009 1:33 PMIn the introduction of a book I wrote a few years ago for O'Reilly:
Finally, this is not a book that uses words such as paradigm and ontology. In this book, companies and projects release products; they don't optimize passions for agile solutions. And bugs are called bugs.
Matt Doar on March 20, 2009 1:45 PM#3 got me thinking about strings in c#.
If you inline a few string functions does each method create a 'new' string?
string foo = a b c d e ;
string bar = foo.TrimStart().TrimEnd();
So if as you stated Jeff a string is never modified, rather a new one is created, then how many strings are created in the above code, 2, 3, or some other value?
btw - congrats on your kid, mine came 3 weeks ago tomorrow. sleep is so golden right now.
RobRolls on March 20, 2009 1:50 PMDude (more precisely, ThatGuyInTheBack), jargon is meant to convey with meaning with precision, not to obscure things or convince anyone of anything.
Regular expression has a very precise meaning. If you don't know it, you probably don't know what you can or cannot do with it. You cannot validate an arithmetic expression with parenthesis using a regular expression, but you can validate one without parenthesis.
That tells you when you have to break out a grammar to solve a problem. It also tells you when your Perlish expressions -- confusingly called regular expressions -- cease to guarantee performance.
And it has NOTHING AT ALL to do with symbolic string substitution.
Byte is a UNIT. Just like miles, grams, meters, liters, etc. Yes, one byte is 8 bits (except when it's 7, 9 or 16, or some other number, by the way), just like a foot is 12 inches. So what? It's useful.
But, more importantly, byte did not START as, simply, a unit. A byte was smallest piece of addressable data, and in some computer architectures it was NOT 8 bits.
I'd have to go for Concurrency and Instance. Mention those two words to non-programmers and watch the questionmark appear over their heads.
Frode on March 21, 2009 3:03 AMWhat we really want to know is the proper mispronunciation of these words. My guess is ihd-eem-POORT-eent, owe-rr-thoog-OH-nail-tie, ee-MYOU-table-tea.
other wayne on March 21, 2009 4:14 AMIn my c++ days, it was dereference. Everything made sense when I realized what that meant.
Now there's a couple big ones that really say a lot with a little for me:
- tightly coupled
- Anything in Big-O (wrt algorithmic complexity)
- Any well known design pattern name.
Mine are encapsulation and decoupling.
These are really probably just $1 dollar words as they're not as peculiar as, say, idempotent. Yet I think these two words, when applied as practices, contribute with the most impact to writing better real-world software systems than any others that have been mentioned here.
RogerV on March 21, 2009 6:11 AMTwo functions f and g are inverses if g(f(x))=x.
Using mathematical definitions without knowing them precisely often results in a mess.
The definition is that g(f(x)) = x _and_ f(g(x)) = x.
If you just consider functions over natural numbers, e.g.
f(x) = 2 * x
g(x) = floor(x/2)
fulfill g(f(x)) = x, but not f(g(x)) is not x for all odd numbers.
Bug
The word on which you'll spend all the money you earned, learning these and other 5-dollar words, trying prevent.
Does it qualify as the million dollar word?
Matt Cox on March 21, 2009 6:36 AM
I recently came across your blog and have been reading along. I thought I would leave my first comment. I don't know what to say except that I have enjoyed reading. Nice blog. I will keep visiting this blog very often.
Alessandra
http://www.craigslisttool.info
I can't believe no one has mentioned obfuscation yet
of course, there's my favorite made-up one...
Continuous Disintegration
Antonio Yon on March 21, 2009 8:58 AM
How about Cartesian Product? I had a case recently where table joins were creating absolutely monstrous and untenable replies to queries.
Yes, this isn't blogging. I have removed it from my bookmarks. adieu.
The $5 dollar bill pictured has a tracking history at:
http://www.wheresgeorge.com/report.php?key=1bf2afbb76d31bc4a0c370d4d8819e3c1f32bb0c65be0cb0
Another Jeff on March 21, 2009 10:56 AMOrthogonality has a slightly more interesting meaning than independent when one speaks of programming languages and libraries. It relates to the uniformity or generality of the abstractions and idioms of a language or library facility. Orthogonality can come from a variety of properties.
A good example of orthogonality is basic arithmetic operations in various languages. In Java (for example) you can do arithmetic on primitive numeric types like int using operators: a = b + c. However, Java does not have operator overloading. So extensions of the Java language that add number-like types must make up a new idiom for doing arithmetic; one cannot write the expression a = b + c if these three variables are, for example, instances of BigIntegers, or some class representing complex numbers or rational numbers.
C++ on the other hand has operator overloading, and extensions like this can be written to use operator syntax for arithmetic. In this case one would say C++ operators are more orthogonal than Java operators, because the concrete constructions involved have broader applicability and can be extended to apply in more cases in the C++ language than they can in Java.
In other words, orthogonality means that for each notional concept (adding two quantities a and b) there is [very close to] one concrete construction in the language to express it (a + b). The more variations and gotchas that one is forced to use and remember to express the same notion, the less orthogonal the language. It's related to the Principle of Least Astonishment: A BigInteger and a Complex and a primitive int are all 'number-like' and can all be added! Why doesn't the + operator work on all of them!?
What orthogonality buys you is a multiplicative effect in the expressive power of a system as you add features to that system. A perfectly orthogonal system with N features can be made to express N*M additional concepts by adding M features, where as a completely *non*-orthogonal system can only be made to express M additional concepts by adding M features. Most systems, naturally, fall somewhere between these two extremes.
Interfaces, operator overloading, and things like Python's magic methods are common language features used to enhance orthogonality: I can use a for-each loop on anything that implements IEnumerable, or I can use the + operator on anything that overloads operator+() or I can call str() on anything that implements __str__().
To consider why it's a good property to have, would you rather write 10 algorithms that each work on all of 10 data structures (orthogonal), or would you rather have to write the same 10 algorithms 10 slightly different ways in order to get the same amount of functionality (non-orthogonal)?
Even if you had to implement the algorithms differently for each of the 10 data structures (as you would for the addition example), would you rather have to remember 10 different ways to add 10 different kinds of 'number-like' things (non-orthogonal), or simply have to remember + adds things (orthogonal)?
Anyway, I guess my vote is certainly for orthogonal :)
Kyle S on March 21, 2009 12:34 PMNot software specific but a word useful in Requirement Analysis - platitude. Seen in pointless requirements like The software shall be user friendly.
cpns on March 21, 2009 12:54 PMA little off topic but I thought this was interesting. I just upgrade to IE8, which has a new feature called Suggested Sites. Here are the Suggested Sites for Coding Horror:
1. Command Prompt Tricks
2. Windows Command Prompt Tricks
3. Command Prompt Commands
4. Command Prompt Tricks
5. The Command Prompt in Windows XP
This Suggested Sites sounds like a GREAT new feature. Now I am off to learn about the Command Prompt.
Duality of syntax
A language feature provides a duality of syntax feature, if the effort to change program A to program B, becomes easier with that feature.
Brevity
A feature that makes the program shorter.
Brevity features enables duality of syntax.
Marshall Flinkman on March 21, 2009 1:46 PM(First post ever- been reading a couple of weeks and love this blog!)
Recursive - The classic definition is: look up recursive in the dictionary and it will say see recursive
(phase, not a word - and may top the $5 limit)
Non Repudiation - From security: The sender cannot deny sending a message that the receiver can neither deny receiving the message.I sent it, and I cannot deny I sent it. You received it, and you cannot deny you received it.
My Votes: Tuple, Closure, Taxonomy, Covariant...
To the how is orthogonal not equal to independent crowd.
In my head, Orthogonal != independent because orthogonal implies that two solutions are dependent and related, but they do not affect one another. Using a two dimensional example, moving up and down the y axis doesn't affect the x axis, If you have a function that accepts and x and a y value and returns the point of these two, you cannot have the x value affect the effect of the y value (that is, y cannot be a function of x).
From a math perspective, Orthogonal means perpendicular and it's very clear that for two lines to be perpendicular, They must meet some strict criteria.
In some ways, for something to be orthogonal it is similar to being deterministic, but, instead of relying the on the function returning the same output for the same input, you're relying on the input not modifying another input. It seems like this could be mathematically provable, but I have neither the skill, patience, or free time to pursue it.
ontology.
And just putting all your data in a wiki is not the same.
Tim Williscroft on March 22, 2009 4:46 AMState (stateful, stateless), and Referential Transparency.
Germán on March 22, 2009 9:29 AMFubar. f*cked up beyond all repair.
Saying there is 'a problem' or something has 'gone wrong' sometimes just doesnt get across the gravity of some situations.
So in project management jargon it's time to 'leg it'.
None on March 22, 2009 11:19 AMHey I don't know much coding but I like reading blogs I can tell you the word that most impacted me and made me do 'aha' and that word is Laconic. It can be used to describe the Spartans(remember 300). It means to say very little but bang on target....Just like a short efficient code.
Pro designer on March 23, 2009 3:04 AMWhat about those ones :
Smoke testing
Diamond problem
Progressive Disclosure
object-relational impedance mismatch
Situational applications
multi-versioning
Mine has to be Draconian Validation its sounds so cool, and you get very few chances to say it (in context of course)...
Chepech on March 23, 2009 11:54 AMIf words can have poor usability, this post and its comments prove it.
Vance on March 23, 2009 11:55 AMCan someone post a real code example of Idempotent(cy). I can't think of any.
As far as I know the mathematical description is:
f(x) = f(f(x))
As someone pointed out, but I can't think of any method I have coded that falls into this category. The only examples I could think of are something like:
public double idempotent(x:double){
return x * 1;
}
But those are not a real life examples.
Chepech on March 23, 2009 12:13 PMTwo words that have been guideposts for me arrived in one package, specifically Yourdon and Constantine's Structured Design, which we used as a text in my undergrad work:
Cohesion - the relationship of elements within a software component (e.g., functions within a C source file, methods within a class). Cohesion should be strong, meaning the elements are closely related; throwing miscellaneous functions into a 'junk drawer' utility class is poor/weak cohesion.
Coupling - the relationship between discrete software components. Coupling should be weak: only use declared interfaces, and make those interfaces as small and simple as possible, so that components can be modified in isolation. (In other words, so that components are orthogonal.)
Kevin Shaum on March 23, 2009 1:10 PMIsochronous vs. asynchronous are two that I mixed up for awhile, mostly because as a software guy, I was so used to the concept of asynchronous I/O and APIs.
I actually misheard it the first time a colleague used isochronous; he was referring to USB transfer protocol specifics (ironically, http://en.wikipedia.org/wiki/Isochronous actually calls this specific case out).
When I later referred to something was working on as asynchronous, he said you mean isochronous? A great to-may-to/to-mah-to conversation ensued... and he gave me a new $5 word.
Preed on March 23, 2009 1:16 PMSubsume:
To include or place within something larger or more comprehensive : encompass as a subordinate or component element
Ever since college where we used it when discussing logic design and minimization I've found I use it frequently - particularly when trying to refactor objects or generalize problems. For example, making a more generalized schema that subsumes several problems we used to express in different schemas.
Kendall Miller on March 24, 2009 9:09 AMNice words, Jeff Atwood.
Dan Finch on March 24, 2009 9:20 AMHeuristic!
Michael on March 24, 2009 10:04 AMOne of the words we've learned to use a lot here is dehydrate. This is a point in a process where data is written out to a database, a bit like breakpoints in a debugger.
I love saying the phrase dehydration store when a non-techie is around. They have absolutely no clue what I'm talking about.
Jay Ramos on March 24, 2009 11:35 AMChepech:
A real-life, but trivial, example could be something like a setter function.
public void SetSomeVal(int x)
{
this.val = x;
}
Whether you call this once or fifty times with the same x passed in, the result is the same.
Another example might be the following shopping cart scenario.
class ShoppingCart
{
private List cart;
public void RemoveAllItems()
{
cart.Clear();
}
}
...
myCart.RemoveAllItems();
myCart.RemoveAllItems();
myCart.RemoveAllItems();
myCart.RemoveAllItems();
Again, calling this method one time, or 100 times, the result is the same.
Compare that to the following.
Suppose we add a method to the cart class above called AddItem, written as such:
public void AddItem(Item item)
{
cart.Add(item);
}
And later...
myCart.AddItem(someItem);
myCart.AddItem(someItem);
myCart.AddItem(someItem);
myCart.AddItem(someItem);
If our cart allows multiple of the same item to be added, we have a much different result.
Hope this helps!!
Jeremy Nunn on March 25, 2009 3:59 AMI like these ones:
Nondeterministic finalization
Runtime polymorphism
Synchronization primitive
If my project manager starts bugging me, I just start reeling these off at random, and he goes away...
Sam on March 25, 2009 5:27 AMnamespace was one of these for me. Or, a visibility problem in concurrent code. Or lambda calculus. Sad thing is, I actually do have a degree in CS and have actually known what these meant some years ago. :)
Chepech, Jeremy Nunn,
the problem is that the different meanings of idempotent are happily mixed up here. But the mathematical meaning doesn't really make sense for programming problems. The Wikipedia entry is much more clear:
http://en.wikipedia.org/wiki/Idempotence
In computer science, the term idempotent is used to describe methods or subroutine calls that can safely be called multiple times, as invoking the procedure a single time or multiple times results in the system maintaining the same state; i.e., after the method call all variables have the same value as they did before.
Thus f(x) = f(f(x)) makes sense if you consider x to be the overall program state before calling the function f and f(x) to be the program state after calling the function.
Secure on March 26, 2009 1:41 PMFor me it's Single Table Inheritance. Ok, that are counted three words. Anyway, it's a technique of ActiveRecord, Ruby On Rails' ORM. What it makes 5 dollars worth, is that it specializes the word inheritance, which is itself a very useful word in the programming domain.
Single Table Inheritance means, that you save different objects, that are instantiated from different classes, that therefore inherit from the same superclass, are saved in the same table.
Not so easy the explain, I'm glad that I can just say es tee ay and my colleagues, know what I mean ;)
Tawan Sierek on March 27, 2009 9:01 AMFavorite definition of a five dollar word: In order to understand recursion you must first understand recursion.
John on April 15, 2009 7:23 AMI'm surprised no one mentioned defenestrate. It's what you do to your computer when you know your code _should_ compile yet it _wont_.
tekproxy on April 16, 2009 11:17 AMdeadly embrace
and
Pseudo-conversational (programming)
roo on April 20, 2009 3:38 AMI think you will make these projects into a success also!
Sexy costumes on July 13, 2009 7:38 AMMy favorite $5 concept is atomic. An atomic operation can not be interrupted and left partially complete by other concurrent operations, it either completely succeeds or completely fails. Its mostly important at the lower layers of the system, at higher layers the operations become so large and complex that you use locking or other mutual exclusion techniques.
Denton Gentry on February 6, 2010 11:16 PMThanks for the words, I have to admit I hadn't heard of the first two and the third I only had references from reading large novels as a kid. If I can, I'd like to add a vote for abstraction as a $5 word, mostly because it takes a lot of people a while to actually get it. Just like pointers. Which I could add but it's such a basic concept, even if it does take some years to actually figure it out.
Keven Sutton on February 6, 2010 11:16 PMCode smell, while not exactly a $5 term, communicates quite a bit with very little.
Jon on February 6, 2010 11:16 PM@Steve and Chris:
I agree - I thought the same thing.
@Jeff
I think an example would be:
a = foo(x)
b = foo(x)
a == b ALWAYS
Jon Cage on February 6, 2010 11:16 PMIdempotent is always a good one, and is also a word any good web developer should know. :-)
Also, I don't know if it's necessarily a $5 word, but technical debt is a term I love to use.
Jason Baker on February 6, 2010 11:16 PM@irrelivant
brevity
pure brilliance.
Keven Sutton on February 6, 2010 11:16 PMMine is a two word phrase for a single word, 'Deadly Embrace'
Wilson on February 6, 2010 11:16 PMIt's funny; you've just identified a concept that I just used in a hobbyist game programming project, but I didn't know the name of it: idempotent. In my game loop, there are two steps: Update and Draw. By making the Draw function idempotent, I was trivially able to implement pausing at ANY time in the game. The Draw call never updates game logic; it only reads from it. So now, if I want to pause the game, I simply do nothing in Update.
Daniel F. Hanson on February 6, 2010 11:16 PMI like dog fooding, basically using your own products.
http://en.wikipedia.org/wiki/Eat_one%27s_own_dog_food
Paul RObson on February 6, 2010 11:16 PMThe comments to this entry are closed.
|
|
Traffic Stats |