John Ioannidis' work is fascinating in that respect as well.. not just in the medical field, but science in general.
150 karma · joined January 4, 2012
John Ioannidis' work is fascinating in that respect as well.. not just in the medical field, but science in general.
I always start out getting a book, which I then don't read the majority of (although that is a luxury of moving from web language to web language instead of something more drastically different). I'll read how to get the project setup, and skim basic framework object structure (this is where having a book you can easily skim back-and-forth in is handy). Then I'll just start. Most simple stuff (syntax to traverse a collection), I'll just Google quickly. Inevitably I hit a framework aspect that's unique or in-depth enough to merit study, and then I'll read that section of the book completely.
If you're using a third-party library with source, stepping through some of the logic is generally something you end up doing anyway, but it's pretty useful to do right away to get an idea of some of the optimal structural tricks the more familiar devs use. Maybe follow a couple of API calls for a step or two to see how they arrange things.
Once you've done enough to feel comfortable (maybe the first couple chunks of complete functionality in the bag), it's good to Google around for things like "Common Mistakes/Pitfalls in X". You'll probably have run afoul of a couple of those, and will now be familiar enough to understand and remember them. You can go back and clean up the little bit of code you did then.
However, the reality tends more often to be: - Frantic Googling trying to figure out the magic code to pass to a black box 3rd party component that will prompt it to spit out exactly what I need - Banging 3rd party components together to see what happens to be compatible - Trying to figure out how to work around the limitations of an API without being too inefficient or complex - Spending 4 times longer on conference calls discussing a problem than actually fixing it
God forbid I needed to add a single boolean field to a single screen. By the time I submitted the DB change request, then changed the abstract factory interface, then the abstract factory class, then the factory interface that generated, then the factory class, then the abstract DAO interface that generated, then the abstract DAO class, then the parent DAO interface, then the parent DAO class... pauses to catch breath ...then the child DAO interface, then the child DAO class, then the controller object interface, then the controller class, then the actual page, then the unit test, it was 4AM and time to go to sleep.
Let this be a cautionary tale to any future architects out there.. remember that flexibility is a MEANS, with the ends being less time and money spent coding and maintaining code. It's not an ends to itself, and can even be a hindrance to the ends.
If anything, the human mind seems to me to be a particular algorithm that is flexible, but trades that flexibility for capability in certain problem areas. Using a transportation metaphor, it's like walking versus air travel. Walking is incredibly flexible when it comes to where you can go, but air travel is by far the optimal route to get from coast-to-coast, although you are limited to travelling between airstrips. I feel like focusing on the human brain as the "true" intelligence is like claiming that walking is the only true transportation, instead of focusing on optimal routes for each problem.
In addition to the distortion of perception through second-hand accounts versus perception through actively participating in the modern scene, I'd argue that no small part of the perception of modern presidents is affected by the proliferation of media sources and the formation of specialized media outlets with a particular ideological audience that didn't exist as widely in the past.
Not to be dismissive of the impact to those who have up to this point been able to afford it and now must change their lives.. but I don't know if there's any 'cure' for people wanting to sell a scarce resource to the highest bidder.
I've worked on at least a couple of open source projects now that have a strong and active core team building everything, and who are talented enough to write great code. But when it's almost time to launch v1.0, the call always goes around: "Who's willing to write the documentation?" And the response is always silence. Documenting just isn't as "fun" as coding, I guess.
But it is, arguably, at least as important if not more, if your goal involves popularity. I recommend open source software projects to groups who are looking for an open source solution, and the ones with an active support community and good documentation, but some sloppy code, win every time over the expertly coded masterpiece that can only really be understood by stepping through the code in a debugger.
But wait, who watches..
I try to stay mindful of the limits of short term brain storage.. if there's over 7 unique variables or interval indicators, it might be tough for someone unfamiliar with what's going on to pick it up without wasting extra time noodling on it. When you've got a sum over 'm', a sum over 'm,n', a product sum over 'n,x' and another over 'x', etc.. sometimes it's just easier to bite the bullet and give a visual aid so the reader's not trying to envision all these overlapping regions in his head while still trying to remember what each is supposed to represent in real life.
For a recent example, my thought process yesterday: "So let's see, it says to multiply all of the 'F' functions, from 'm' to 'n'.. 'F' is, what, the base array? OK, so that makes 'm' and 'n'.. hmm. Let's come back to that. OK, so we multiply the product of those 'F's times the product of all 'alpha's of 'm,n' over 'm'.. so alpha is, let's see, the.. message? And... uh.."
Long story short, I finally deciphered it just meant "Multiply the base array of values by the value of each message that comes in that shares a parameter," only it took about 5 minutes instead of 10 seconds.
Once when using an Adobe application that was behaving erratically, and I was unable to see what was happening internally for myself (and obviously the behavior wasn't documented). Incredibly frustrating, and no recourse except to hack around it and hope it didn't mutate.
More recently, I've been bitten by a fairly popular open source application that I intended to use without modification (just configuration). But the documentation was so awful that I couldn't even figure out how to configure it. Ultimately, I had the recourse of stepping through the code to figure it out, but when you're trying to build adoption of your application, it would make sense to make it usable for its main purpose without setting up the actual source code in a debugger.
One interesting generalization I see is that the user-friendliness and documentation of the open-source app correlates quite often to the language used. PHP and Ruby projects seem to be built with an eye towards helping the eventual users use it. The Java projects, while often more competently written and complicated, seem to often be presented as code-only, take it or leave it, user-friendliness be damned.
Luckily, our Footnotify* software is here to help! For only $99USD a year, your internet arguments will be changing minds from Amazon to Zombo.
*not to be confused with FootNotify, the foot soaking timer app, property of Scholls, LLC