Code iceberg is in the eye of the beholder. Recently started bizdev-people consistently underestimate the time requirements for certain well-exercised tasks.
Some of the most common icebergs are:
-form validation (seriously -one of the most highly exercised user-interaction paths; it's all over the place, and scales semi-exponentially with the number of fields)
-search ("how hard could it be? you just put an input form there, then figure out what the user thought, then display it" -exact quote)
-anything that has to process natural language. I mean everything. Wanna split up a text into sentences? How do you differentiate between dr. mr., 2004. jun. , and valid sentence-enders? Generating a definite article ("a", "an") before a noun? Keep in mind that 1,2,@,$,=, and other characters might also be valid noun first-letters :)
etc.
In my experience, the best anti-iceberg pattern is to follow a portfolio approach, and for each requirements which smells like iceberg, have a fallback plan in place -ie. after N hours of sunken investment, execution shifts to plan B. Usually works out much better, than banging away on the same problem for days.
A fun example I had to deal with was a big site which processed lots of terribly formatted data to build its content. One particular rule for processing incoming data relied on breaking a big blob of text into very specific fields based on where capital letters fell.
We had made a point of asking before the project if regionalisation was ever going to be an issue and no, it would only ever be in English. Shortly after go live we were asked to regionalise everything into Chinese.
I'm still not sure what a capital letter looks like in Chinese.
"How do you differentiate between dr. mr., 2004. jun. , and valid sentence-enders?"
Fun fact: there exists a convention stipulating a double space after a period that ends a sentence. Not that I'm advocating relying on this for any serious purposes
HTML ended that. I have followed all periods with two spaces in this post. How can you tell on the screen?
In fact I just checked, and HN is honoring the two spaces, in that they are output to the actual HTML sent to your browser. And of course, yes, there were other trends that would have ended this anyhow, "two spaces" in meaningless in a non-monospaced font and ever more stuff is going proportional as the computing power necessary to do that continues its steady march from "prohibitive" to "trivial", but the WWW certainly beat the corpse to death again.
The monospaced or proportional fonts aren't the issue; it's that HTML treats all sequences of whitespace within text as a single space. It's quite annoying to those of us who like our double-spaced sentences. When a word processor generates HTML, every double-spaced sentence ends with this:
HTML and proportional fonts are two separate issues. HTML ignores them, which is one problem; two spaces in a proportional font being less immediately obvious than on a typewriter is another problem. You can come up with some other issues too if you think about it. It all adds up to a dead tradition.
It is not meaningless in a non-monospaced font; two spaces should still be wider than one space. I use a double space after a sentence in all of my technical writing, and I'd be extremely disappointed if my wordprocessing package did not honour that.
I grew up with that drilled into my head in typing class but, come to find out, now it is not followed in many cases. Most type faces should only have 1 space after the period. http://www.wsu.edu/~brians/errors/spaces.html
It took me forever to stop hitting the space bar twice after ending a sentence.
This is far from universal. I know that when I studied journalism, I had to unlearn that habit - I think the official style guide for the industry mandates one space.
That was an old typewriter convention. I learned typing on a typewriter in highshool. Wordprocessors in the 80's eliminated that convention. They would automatically perform the proper spacing.
There is also a convention of capitalizing the first letter of a sentence. The example text demonstrates that corpus quality (forgive the fuzzy terminology) trumps clean, simple rules.
Yep. First letter of a sentence, or title, or any other proper noun. So... how can your program tell which it is? The correct algorithm approaches AI in complexity.
In data/text mining disciplines, correctness is fuzzy, rather than being boolean. For most industry-wide applications, having a solution that covers 99.9% of the cases (1 mis-classification in 1000 sample) is well below acceptable bounds.
So, one particular solution with these performance characteristics is building a decision tree using a bunch of training data, and eg. a maximum entropy classifier. Add some sample data from any openly available corpus's (or fire up mturk, and create your own), and you're pretty much done with it.
Of course, sentence-tokenization is only the tip of the iceberg :)
I spent 4 months, full-time (I think I was a bit depressive and unproductive, though (that might have to do with the difficulty of the problem a bit)) to make a goddamn "error message merging" system where you specify some merge rules for error messages, and then said messages are "merged" efficiently at runtime (with another of my adaptations of the awesome Rete algorithm).
For instance, as a trivial example merging "Please enter your Username." and "Please enter your Password." could yield "Please enter your Username and Password."
Merging error messages efficiently with a great concise syntax looked SO EASY =/ I was wondering why the hell no websites (that I know of) do that because it's a pretty obvious feature to me... Well, now I know. People don't really mind that much about these things (maybe they just have low expectations) AND it's really hard to implement.
I finally made it, right now the implementation is utter crap, with some missing features and some bugs but the general architecture is there and works. I'll clean it up and document it within a few months, probably.
It's one of the hardest things I ever made so far in programming.
Steve Yegge once wrote a post on this sort of thing. It's called "Have you ever legalized marijuana?", but it doesn't focus on marijuana all that much.
Except that his conclusion is way off for the Marijuana part. There are lots of countries where Marijuana is legal and/or tolerated, so apparently the legal systems are a lot more flexible than the US, or Yegge's estimates for refactoring costs in the legal system are way off.
I've probably fallen for these more often than I'd like to admit. Yet sometimes a naïve "how hard could it be" is exactly the right approach that leads to unexpectedly simple solutions.
This might not be such a fantasy as you think it is. Yes, it will be very unpolished. But you can get the basics in place in a couple of hours: login, questions, answers and voting. I agree though that to get it to the level of stackoverflow will be very hard indeed in a weekend ;)
I think a code iceberg is actually a symptom of either working at too low a level, or relying on a library with missing/broken features. You see libfoo, and you think "great! I'll use that to implement foobar-ization functionality!" but then, after playing with it for a bit, you realize that foobar-ization actually requires you to do all sorts of crazy things with the output of libfoo before you can use it in XYZApp.
Now, you can put all those crazy foobar-izing things into XYZApp, and that'll work—but they should really either go into libfoo itself, or into a new library (libfoobarize) that uses libfoo.
This is the case with the example in the article: DuckDuckGo shouldn't be parsing Wikipedia to make its own abstracts. MediaWiki already creates abstracts—they're just bad abstracts. The correct thing to do, since MediaWiki is just a regular ol' FOSS project, is to write a patch that makes MediaWiki spit out good abstracts, that are actually trivial to use in DuckDuckGo. Or, even better, if you know MediaWiki cares about having good abstracts, just submit it as an issue to their tracker and let them do it for you. In other words, repeat the programmer's litany to stave off NIH: "It's not my job. I shall buy, not build. 80% of the features at 20% of the cost. Don't ask a question, send a message. No god-objects. Encapsulate, encapsulate, encapsulate."
Note that, of course, there are cases where there really is no libfoo—but then you're doing something totally new, and you can tell the client right up-front "no one's ever done this before, so we have to schedule time for R&D before we can even tell you how much time this feature will take."
There is also the case where the only libfoo/libfoobarize is a proprietary one used by the people you're trying to steal market-share from by implementing this feature, in which case you can tell your client "we know it's possible, but we don't know how long it took them to build it. What we do know is that no one else has yet copied them, which means that foobar-ization isn't trivial. It'll probably take a while."
Another class of code icebergs are numerical algorithms. Often a few dozen lines of Matlab or R can be the result of months of effort. Failed approaches, tolerance thresholds, manual data cleansing, and more can all end up living as a few lines of math.
You won't believe how many times I've been in a discussion about something and the other person has said "oh that's easy to do" or "it can be done in a few hours" when in fact if they were to go into the details, they would see the hiding devil...
My personal red-flag phrase is "You just need to ..."
Favorite occurence: "You just need to build a state machine." Yeah, saving the whole browser-side state (did I mention third-party GUI components?) of an application and reestablishing the server-side session state to match it is really easy with this piece of sage advice.
I think great products tend to have a lot of complexity, but most of the complexity is hidden away from the user. This picture sums up this thought (and it mimics Gabriel's iceberg metaphor quite well): http://amix.dk/blog/post/19555#The-essence-of-minimal-produc...
On the topic of mining Wikipedia, DBpedia (http://dbpedia.org) is a fantastic source for structured Wikipedia content. Extracting data is pretty easy with SPARQL.
Twitter is one of my favorite examples of this. Lots of people look at it and say, "it's so easy implement to build." I'd like to see them scale it to millions of users.
I'd be surprised if anyone thought building Twitter with similar scalability would be easy. Sure while you cold fit it into 1 mySQL DB it would be easy to get the basic features down with a much simpler UI and no API. Past that though they would be vastly underestimating the work.
scaling twitter is easy. it is getting the users that is hard. I can say this because I was part of a service in 1999 that had more users and volume (bytes/hits/etc.) yet didn't have nearly the same issues.
I can say this because I was part of a service in 1999 that had more users and volume (bytes/hits/etc.) yet didn't have nearly the same issues.
Not to be rude, but I doubt it.
Twitter currently has 175 million users[1]. Estimates in 1999 for the online population of the entire internet were 259 million, with 110 million in the US [2].
In 1999, I imagine Yahoo and maybe a couple of other sites (Microsoft/Excite/AOL/Lycos?) were getting similar traffic numbers to what Twitter does today. BUT the scaling is very different, because Twitter requires fan-out of messages, which none of those sites did.
Icebergs are a good analogy for technical debt as well. The hackish stuff below the surface, often done against better advice invariably causes serious damage.
Some of the most common icebergs are:
-form validation (seriously -one of the most highly exercised user-interaction paths; it's all over the place, and scales semi-exponentially with the number of fields)
-search ("how hard could it be? you just put an input form there, then figure out what the user thought, then display it" -exact quote)
-anything that has to process natural language. I mean everything. Wanna split up a text into sentences? How do you differentiate between dr. mr., 2004. jun. , and valid sentence-enders? Generating a definite article ("a", "an") before a noun? Keep in mind that 1,2,@,$,=, and other characters might also be valid noun first-letters :) etc.
In my experience, the best anti-iceberg pattern is to follow a portfolio approach, and for each requirements which smells like iceberg, have a fallback plan in place -ie. after N hours of sunken investment, execution shifts to plan B. Usually works out much better, than banging away on the same problem for days.