Systems Programmers Relax - Most Programming Advice Isn't For You
axisofeval.blogspot.com
axisofeval.blogspot.com
It is very true that software development techniques and practices should differ, perhaps even greatly, depending on the nature of the project. It's most important to be able to have the experience and knowledge necessary to know when and where to use one technique over another rather than to just be a mindless sponge of advice.
It seems to me like the problem is at the college level. My school offered just one software engineering class, which taught one monolithic method of developing software. A couple of semesters developing different types of software using different methods of development would have been nice.
I think there is an expectation that a 'seasoned' developer can be good at all types, but often that's not the case.
We certainly need a mix of both, and they absolutely need to get along (to some degree).
In a way it's the contrapositive of one of my annoyances with TDD. Sometimes TDD advocates (along with anyone selling a methodology I suppose) get overzealous and start making ridiculous claims like "TDD ensures program correctness". When pressed they may backpedal and acknowledge that unit tests are no substitute for mathematical proof. But yet there remains a dogged obsession with one particular technique. Take the experiment of writing a Sudoku solver via strict TDD (http://xprogramming.com/xpmag/OkSudoku). It's obvious that TDD doesn't help you write better algorithms. It's a good discipline for ensuring test coverage, it gives good sanity checks, and it can even help the modularity of your program, but it sure as hell doesn't inherently lead to better code.
So whether you spend years thinking things through before writing a line of code, or most of your time is spent writing and rewriting tests to ensure the perfect coverage, it's always worth reflecting on the effectiveness of time spent and diligently avoid cargo-culting on methodologies.
"Beware of bugs in the above code; I have only proved it correct, not tried it." - Donald Knuth
If I offended your sensibilities, my apologies.
As a long time device driver and embedded systems programmer, I've found that thinking about the solution only gets you so far. Almost always, intelligent prototyping will make progress quickly. Especially when working with poorly documented hardware, or a system that will never be fully characterized (imagine a complex electromechanical device where the output lags the software commands by many seconds or milliseconds and not in an immediately obvious way), a quick experimental script is often the only way forward.
The key question: when new requirements (an inevitability) force you to re-engineer a key element of your system (an inevitability) will you have to perform more "experiments" to figure out which random mutations of your previous design yield the desired results or will you be able to mostly plan ahead of time how to change your design to have the desired characteristics?
If it's the former then you may be faced with the prospect of a change of requirements that you are incapable of coping with, causing your business plan to die. Many software companies have met that fate.
Running usability tests with real developers on your API is extremely important to understanding how understandable and straightforward your design is - if you're an OS or a platform component, you don't get a 2nd chance to design an API; you do it right the 1st time or you live with the consequences for years to come.
I think that is exactly the author's point, at least if you think that the best way to get to the Right API is to "think about it really hard" instead of "write a bunch of crappy prototypes".
As a question to other startups based on novel systems, did you feel that an MVP was the right way to go? If not, what did you do differently so as to not labor in "almost, but not quite ready" limbo.
Make it work. Make it right. Make it fast. In that order.
Restructuring data is, in most cases, a smaller issue than it may seem. Running systems don't normally crash and burn over night. More often you'll see it coming and have plenty time to apply bandaids while transitioning to a new system.
Doing so is much easier when you can actually see and measure the bottlenecks, rather than trying to predict them beforehand.
In other words: Embrace the limbo. ;-)
It starts with a invalid premise (that 99% programming advice amounts to "Do The Simplest Thing That Could Possibly Work") and then "criticizes" DTSTTCPW by bringing up completely unrelated issues (thinking vs. coding ratios), along the way making vague and disconnected distinctions between systems and application programming (is MySQL a system or an application? What is the crucial characteristic between those that makes some programming advice applicable to one but not the other).
The opposite of of DTSTTCPW is either doing things that don't work or things that do work but are more complex than necessary. There really isn't room to disagree with DTSTTCPW.
Thinking vs. coding is a false dichotomy. At the end of the day I don't care if Richard Hipp thinks for 8 hours and types for 10 minutes or if he types for the whole day without thinking first, as long as SQLite is a kick-ass software.
Personally I found that there's a (very small) limit to how much I can design up front (thinking phase) before I start implementing my ideas (coding phase). I invariably find that coding improves my understanding of the problem (often forcing me to update my designs) as well as giving me more ideas (it's not like my brain shuts off during coding - thinking is going on in parallel).
This is the core of agile argument: we're not smart enough to think about everything up front so the only realistic option is to start small and simple and build more complex things as we go and learn.
The author might be content with the fact he hasn't shipped his software in 9 years but I wouldn't take his opinions as relevant to what I aspire to do: writing useful software and shipping it.
Which category would you put Linus Torvalds into? He wrote Linux, but he also wrote git. How about Jeff Dean? He wrote MapReduce and much other core Google infrastructure, but he also played a large part in the indexing & serving system. Guido van Rossum? He started Python, but he also wrote Mondrian.
The second link shows this as a formerly valid command:
pr <"sort input"< >opr>
Ouch!Do not upvote just because you agree. I agree with the comment nominally, but I downvoted it, because it is a waste of space.
Simple test: if there were more comments like this, would HN be a better place? If yes, upvote. If no, downvote. If indifferent/not sure, move on to next comment.
I agree with you here. The problem is that this is not directly obvious by only observing the upvote arrow. It might communicate more things than this, like "I agree with this comment." So, unless you tell them (and keep reinforcing this meaning), different people will read it differently.
I would even argue that it would be a good idea replacing the upvote arrow with a link named "I want to see more comments like this". That would stimulate more well thought, relevant comments, while agreeable/funny comments would still be there, but at the bottom of the page. These might be harmless, but they don't deserve lots of upvotes.
Trying to think what LJ is, but drawing a blank. LiveJournal? (even though his blog is on blogspot?) Anyone know?
I'm kind of amazed that blogs got significantly more respect, but LJ remained firmly below MySpace in being taken seriously. That takes doing, you know?
Some years ago I also believed that debugging was evil! That your software must work in your head, in paper and in the computer.
But, that's mainly an algorithm oriented thinking, when your software is integrated with a lot of third-party pieces it's impossible to progress without debugging.
To me all good practices stem from this - I often get annoyed by cargo-cult, dogmatic, programming practices which remain detached from this 'golden rule of programming'...