Why You Should Choose Boring Technology
An anonymous reader writes Dan McKinley, a long-time Etsy engineer who now works at online payment processor Stripe, argues that the boring technology option is usually your best choice for a new project. He says, "Let's say every company gets about three innovation tokens. You can spend these however you want, but the supply is fixed for a long while. You might get a few more after you achieve a certain level of stability and maturity, but the general tendency is to overestimate the contents of your wallet. Clearly this model is approximate, but I think it helps. If you choose to write your website in NodeJS, you just spent one of your innovation tokens. If you choose to use MongoDB, you just spent one of your innovation tokens. If you choose to use service discovery tech that's existed for a year or less, you just spent one of your innovation tokens. If you choose to write your own database, oh god, you're in trouble. ... The nice thing about boringness (so constrained) is that the capabilities of these things are well understood. But more importantly, their failure modes are well understood."
A personal corollary for code related to this theme is to always try to make the code I write as "boring" as possible. I've found that programmers often get themselves in trouble by trying to be "clever", which often makes for horribly unintuitive or unnecessarily complex systems. I've heard people asking about how to perform crazy language tricks and I nearly always think to myself "My God, why in the hell would you even *think* about doing something like that?" Such things nearly always point to very fundamental flaws elsewhere.
Irony: Agile development has too much intertia to be abandoned now.
It's the same reason that your own small company should be trying to implement its own CRM (assuming that's not its core business), or drastically changing the way that it considers sales compensation. Being revolutionary in one area is hard enough - don't make anything even harder than it has to be.
You're special forces then? That's great! I just love your olympics!
Mature technologies are proven. They've gone through their growing-pains. They may have limitations, but those limitations and workarounds are usually well known by seasoned professionals. There's a reason why COBOL, Fortran, and RPG are still in use in business applications almost sixty years after their initial development, because they reliably work.
I've tried to work with NodeJS projects for production. It's a nightmare. NodeJS itself is revised too often, the actual project is revised too often, and the dependencies became a nightmare. It's not mature enough and not worth it.
Do not look into laser with remaining eye.
In about 1996, Oracle introduced the "Oracle Webserver", allowing you to serve dynamic webpages generated from stored procedures in the database. The beauty of this is that all of your website code is in the database, making it centrally managed and all application security logic is enforced by the database. The webserver is just a dumb client with no code, and has no permissions on any database tables.
In 2001, it was now a mod for Apache and as since been opensourced (mod_owa). I convinced our client try it for a central website that we were developing, as the middle tier crap they were using didn't work. That system went live 2 weeks later with a few very simple webpages. It has been in production ever since and the website has over 50k users and 20+m hits a day.
"Be grateful for what you have. You may never know when you may lose it."
A buddy of mine wrote his own database completely in windows command line through the very extensive use of for loops and a ton of windows command line modules that he built from scratch. At least he made a module where data could be exported to csv.
Hey, everyone here still reads Slashdot!
I've recently been getting more heavily into javascript (proper apps, not just UI animation snippets). The whole scene is a mess. You try to learn about good code structure and you've got crockford saying use constructs to simulate classical OO and then a whole lot of other coders giving you really good reasons to use prototypical inheritance and stop trying to simulate a classical language. Then a whole other bunch are telling you to use coffee script but others point out the difficulties debugging it so then you should use typescript because it will eventually be ecmascript6. Once you get your head around the code structuring options, you then have to decide whether to just use jquery or an mvc like ember or angular. And when you choose a shiny new bbc because it is easy you realise that two way data binding makes your code super slow and start having to hack away at it to get it working on a mobile targets. Oh and don't forget the TDD framework unless you go for BDD because that is the new thing. And then do you use the closure compiler, requirejs for amd or should you even use amd at all.
I will happily go with tried and tested, if only web developers would stop reinventing things every six months.
I think it is important enough to have atleast one 'skunk-works' type project that every developer needs to work on, just to keep up with what will be boring a year or two down the road.
I avoided "not boring" for a couple of years and for the last month, while I look at hybrid mobile apps, I am stunned by my lack of knowledge and the abundance of terms, concepts and technologies that mean nothing to me ... angular, ionic, grunt, promises, JSX, reactjs, compass, gulp, firebase... the list could go on and on and on, these are just things I've started researching over the last few weeks, to make sure I make the right choice.
Every organisation needs a "not boring" slot of time for their developers. Not for product that needs to ship NOW.. but for stuff that may need to ship next year.
It's like Rincewind said: "I like boring. It lasts."
-- Cheers!
This basically sums up things I've said over the years and thought about. You and your team have a problem to solve. Anything that gets in the way of solving that problem is the wrong solution. Learning a bunch of new tech looking for a silver bullet or because it is 'kewl' is the wrong answer. There is the learning curve to consider as well as the instability inherent in a new tool set which needs to be understood when making these decisions.
What is even more distressing is when you see bad ideas return like bad pennies, network databases are now graph databases for example. ACID compliance sacrificed for 'speed'. Having to write you own threading management code. Those immediately pop into my mind. Sure, there may be some short term gains but what about 5 years from now? After a huge investment throwing something away and replacing it becomes difficult and expensive. I am looking for the citation but I once heard that the maintenance costs of software far outstrip development costs by about 10 to one.
My advice is to first learn the problem domain which includes keeping a long term view in mind, then pick the tool set with a bias towards the tired and true workhorses. Spend less time thinking about your tools and more time solving the actual problem.
putting the 'B' in LGBTQ+
As someone who has a lot of Perl on his resume, I heartily endorse companies hiring people who work with boring old technologies!
Don't repeaty yourself (DRY). Don't re-invent the wheel. Well known for a long time. This isn't news.
There's a reason I choose Debian Stable for my servers.
"Nine times out of ten, starting a fire is not the best way to solve the problem." - my wife
For a second I thought this was a Bennett special.
The summary is much too short for that. If it took you a full second to recognize that, I wouldn't put any more quarters into the whack-a-mole machine if I were you.
If your developers are really excited about the stuff they are doing then chances are the ops people looking after the 'finished product' (note the quotes, please) are going to have 'exciting' jobs (again, quotes).
In the free world the media isn't government run; the government is media run.
Yippppeeeeee!!!!!!!!!!!!
Infrastructure is "boring", but somebody's gotta build and maintain those old roads. Go Civil Engineering!
Works great for me. Stay away haters.
What constitutes a boring technology? Say I agree with you that COBOL is boring; will Johhny down the road agree with us, or will it fascinate him? Now, let's say that we all universally agree that COBOL is some boring ass technology (unless you rode the short bus to school, I think we can
OK. Now on to the actual reading of the article:
OH ... how about let's not and say we didn't. So basically, the author claims to be a skilled software developer, but can't figure out that subjective criteria isn't your best bet when analysing data sets, and who can't figure out that you need a premise that isn't absurd to churn out a non-absurd result.
Yes, well that explains why you never actually even attempt to address the question so fundamental to the understanding of your entire theory then, I suppose, isn't it?
Can't you use old 'boring' technology in this case? Don't use Mongodb; use Mariadb/MySQL. Old; tried and true; as 'boring' as it gets by this guy's implied but never stated definition.
... and I just went back and read the subtitle under "Dan McKinley", to wit: Math, Programming, and Minority Reports." Sir, if you are reading this, I have no doubt you are far better a Mathematician than I, but you seem to have made the mistake of thinking that being good at Math and being able to write a few scripts has placed you in a position to pontificate poignantly on subject matter with which you have no actual grasp. Please leave the Software Engineering to the Software Engineers, and I promise not to try to write papers in Math journals. Thanks!
Guns don't kill people; Physics kills people! - John Lithgow as Dick Solomon on Third Rock From The Sun
Townsend wrote about a powerful idea, of the perfect note. Clapton, who crossed paths with Townsend, preferred a simple guitar lick to communicate his ideas. I started as a business consultant with software skills, and I've always considered -- even now as a consulting developer -- a line of code to be the last resort when all else fails -- because of the cost involved. Back before the concepts had buzzwords, I advocated 'just in time' development over 'just in case', and that if you're writing a lot of code you're probably doing it wrong. These days it's called Emergent Architecture on a formal level, and YAGNI informally. Every line of code, every expansion of the technology footprint, should be when all else fails.
The same thing happens with the hope for the "next generation" product solving all the ills of the current generation. Or the assumption that the code you have inherited was created by fools a number of years back.
The reality is that software has a set of maturity related bugs and a set of structural, intractable issues that are related to the design and architecture of the system. Each piece of software has it's unique set of intractable issues.
Software that has been in production has typically reduced it's maturity related bugs. The software built on top or that integrates with it is built around those intractable issues. When you move to a new piece of software - either a new architecture or the "groundbreaking ng version of XYZ", you end up with swapping a set of *known* intractable issues, for a set of *unknown* intractable issues plus a set of maturity related bugs.
Similar to TFA, the risks of old+known vs new+immaturity+unknown needs to have another factor similar to "value-add". If the value-add *really* adds a lot of stare the risks in the eye and march forward. If the value add is marginal, make sure the meta-benefits (performance, maintainability, etc) are clear and understood, otherwise you may be facing a train wreck of an upgrade.
Seen it many times, always wary of the ngXYZ project...
I don't mean Industrial Design.
Steve Wozniak's circuit designs for the Apple I and Apple II computers were pieces of true engineering, but also pieces of art and filled with "clever" bits.
New technologies can often enable completely new business capabilities and strategies that old technologies just can't. E.g.
- Maybe it's far more flexible, cleanly coherent and understandable, so your business will be faster to adapt & outmaneuver competitors.
- Maybe the new tech just takes far less code, complexity & overall time.
- Maybe it's far easier to test & deploy, so your quality will be better.
- Maybe it supports emerging standards with community backing and your business will be left behind when competitors adopt it and customers demand it.
- Maybe it's an off-the-shelf library, by teams with dedicated expertise, instead of writing your own. Instead of wasting your own budget, you can benefit from the work & future ongoing improvements of a larger community than you can individually afford.
- Maybe the new tech can dramatically cut operating costs & resources through better automation.
- Maybe the new tech will just have a much longer 'shelf-life' (ongoing support & compatibility with it's ecosystem), so you're not forced to rebuild it too early.
- Maybe the much greater engagement & motivation you get from tech staff working on exciting, enjoyable (not-boring) tech will have it's own pay-off. Boredom can induce coma, laziness disengagement and alternative job seeking (or worse if they stay), whereas interest & appropriate challenge can spark creativity, innovation & enthusiasm.
- Maybe you're missing out on opportunities to break new ground and deliver customers better experiences than they're used to.
By constantly taking the 'safe' option, you can actually end up in a very high-risk stagnant position, where you'll be slower to market, or new entrants can dramatically undercut your cost structure. It's also very easy to end up with millions of lines of inflexible, proprietary code; because you're ignoring new frameworks that your competitors leverage with just 10's of thousands of lines instead.
Always explore your options. Consider whether there are 'both/and' options instead of just 'either/or'. E.g. Is the pay-off potentially so great that you can run both technologies in parallel, while still having better odds of coming out in front? Can you easily test & prove/disprove the new technology in an isolated, low-cost module first? Will the cost of failure be completely catastrophic, or leave new options & learning?
Products can often live long lives, with most of the cost ending up being in maintenance & future features. But don't just consider the technology you need today, but also consider what will be most appropriate for the organisation in the years ahead too.
When it comes to offerings from Oracle or Microsoft, you in fact want to go with an older, more proven solution that is still supported for long time. But with open source, this will get you burned because all the developers got bored and went to work on something else. With newer projects, there will be bugs but also people fixing them, often quickly and for free. As far as comparison between the two, it comes to scale. If you are lucky enough to create a popular consumer product, at some point costs of proprietary vendor support will become prohibitive compared to in-house development. Also, you may find yourself in direct competition with your supplier and not want to give them all this money even if they are willing to support you. For internal business apps, the equation is often the opposite and you would rather pay for someone than do software development which is not your core competency.
1. If you're a lunatic talking about 'innovation' tokens and are using HTML 4.01 and Flash instead of HTML 5 to deliver a rich media experience, you're a fool.
2. If you're using PHP instead of something like Node for your webapp, merely because PHP is 'old', you're a fool.
3. If you're using MySQL for storage of data that doesn't rely on structured relationships, because MongoDB is somehow "too new", you're a fool.
4. If you're still using CFEngine 2 because fuck those people, you've been using CFEngine 2 forever, you're a sysadmin. And possibly a fool.
I'd once written what I thought at the time was a fairly simple C program to interface with a medical lab system, calculate the checksum (a very, very basic CRC), and pass the results to a file. For the record, I'm a self-taught programmer who started with the Data General Nova assembler, but I digress....Several years later, I happened to meet a programmer who'd inherited my code and, basically, said that it was the best commented, self-explanatory code he'd ever seen and later changes were really easy to make. At the time, I'd just written a device driver was so feeling all punky, but later I realized that what that dude had told me was the highest compliment I could ever receive. $.02 brothers and sisters....
"Let's say every company gets about three innovation tokens."
Bullshit hypothetical statements are bullshit.
BeauHD. Worst editor since kdawson.
And there are usually more training material, tutorials, and road-tested reference info for older stuff. Look one version back and you can get $7 books even. Established technologies don't change that much between versions such that say a book for version 7 won't be much different from the latest, version 8. You can usually find a "what's new in version 8" article on the web for the differences so that you don't have buy the latest book.
Table-ized A.I.
What he suggests has a lot of merit. On the other hand, there are so many companies languishing under inappropriate technology whose problems would be solved if they weren't so boring. Applications that would be transformed if they only used an object database for example. Business logic that would actually be maintainable if they used a functional programming language. Unmaintainable COBOL that would benefit from an object approach. Yes, there are a lot of times you'll ship something faster by being boring. But whether you'll get the best quality? Not so sure.
You have a good point, but only most of the time.
Thomas Kuhn, in the context of science, spoke of 'normal' and 'extraordinary' science. Normal science was as you described; you stay in the paradigm and follow the conventional methods for resolving issues. However, these methods did not appear out of nowwhere; somebody was being a clever cowboy and decided its time to do things different. This is where revolutionary science came in. Of course most of these innovations - like any innovation - fails miserably. But if it wasn't for all the failures we would never have the successes that change paradigms and got us to the methods we use today.
And I think this dichotomy does apply to almost every human endeavor.
That said, for normal day to day operations, being a cowboy ALL the time is foolhardy and dangerous. But for people to NEVER have a little bit of an experimental and innovative mindset is also risky in its own way. Sometimes this is balance (known as a bimodal or barbell strategy) is maintained within a single individual by balance of exploiting the traditional and exploring the novel; sometimes its divided between individuals, with a good balance keeping more people stable than unstable.
ERP done all in javascript using reactjs (before the 2.0 rewrite was announced)? Looking forward to July to see your success.
Is Bennet still allowed to post? I haven't seen any of his ramblings for a while.
I tried very hard to convince my manager that we should do this on a project that used DB2. She was adamant that we would have to write the web services with the full Java stack. Hundreds of thousands of lines of java later (complete with maven, spring, hibernate, ad nauseum) she is no long with the company and the project is cancelled.
You use a very dry description, "minimizing the costs", for things Woz did that I am sure you would lambaste as "carried away" if he'd been working purely in software:
1) replacing dozens of chips for synchronizing data I/O with disk rotation with a software implementation
2) omitting Shugart's Track-0 sensor by having the controller simply move 40 times toward the next-lower-numbered track and relying on the mechanical stop to prevent it going any further down than track 0
3) taking advantage of the way that 6502 instructions only access memory every other clock cycle, the video generation circuitry's memory access on the otherwise unused cycles avoided memory contention issues and also eliminated the need for a separate refresh circuit for the DRAM chips
4) choosing to use a simple timer circuit whose period was proportional to the resistance of the game controller instead of a complex A/D circuit
5) I'm not even going to try to summarize his hacks for handling NTSC color with less hw
Being on the bleeding edge is expensive. Who knew?
Most of the time going for the already-proven technology that solves the problem will provide the best value.
No, thought not. IMHO a classic - almost, in fact, the canonical - example of boring technology that's good because it's boring. Look at all the criticisms of Ada, and you will find that most of them boil down to, "It's not so much fun and doesn't make me feel so good". But that depends on what makes you feel good. As many qualified people have remarked, if you are flying in an airliner you really want the avionics to be written in Ada, not C++ or Ruby or Python. Why? Because you're a lot more likely to survive. Almost unbelievably, it boils down to a matter of professional pride. What gives you a warm feeling - coding something marvellously clever that you yourself won't understand in three weeks, or creating something that works reliably and does exactly the job it was meant to do? One is an amateur attitude, the other is a professional attitude.
I am sure that there are many other solipsists out there.
Well, I have seen a LOT of progrmmers put in something just because it is the latest and greatest ( Ohhh! Shiny! ).
XMl where it was not called for, Flash where it works but is slower, a script in some version of JS because that version was the latest on the
review list.... third party libraries that implement something 'neat'...
Then there's Microsoft - who tries to invent the new and shiny... and usually backs out after a couple of computer generations ( 3 years each ).
The increase in the learning curve and the innate compexity lend themselves to sensitive code... just a small change is a disaster that is nearly impossible to fix.
So you want code to last and work for thirty years? Like the old COBOL finance programs? Or the old FORTRAN/ASSEMBLER engineering programs?
KISS! and if anyone has trouble understanding the code because of the code and not their own ignorance, then simplify it even more!
Complete design before coding - use pseudo-code to design, maybe even work through behavior by hand on paper with an ink pen...
Another way is to apply Karnaugh maps to the state logic variables and program behavior, which should be sufficient to make you inderstand the complexity of a system... and maybe reconsider having such a complex piece of work - reduce the complexity, simplify and then program.
KISS! DO YOU PROGRAM, M**F**ker!
Now if only he can come up with an easily remembered acronym to remind people that they should keep these things simple as much as possible, or else they are stupid.
Boring technologies have usually been around awhile and there is usually a reason for that. Typically they are pretty good for what they are being used for. As a result there are usually a lot of support out there as well as large code bases. Lots of documentation. Resources not only in libraries, code, docs, but also in staff that understand the technology, so it is easier to bring someone in, have them understand what is there, and make what changes may be necessary quickly without a lot of downtime. So yeah, while they are not the most sexy of technologies, they are the core of what gets things done. I'm not just saying that because all my coding is in antiquated languages at this point (I don't do all that much coding really anyway).... :) That said, I recently took a course to "upgrade" some of my experience, and it was developing using PL/SQL which isn't exactly mind bendingly new technology... But you know what? If you use an Oracle DB as a back end (which a big chunk of the world does), having PL/SQL is certainly a useful technology to have under your belt...
do we need this post ?
isn't this something that every single comp sci student is taught from day one ?
isn't this something that an engineer, by definition, knows (KISS) ?
why do we have to keep relearning that 2+2 =4 ???
I manage a team of devs and a project I run sparked a large federal agency to nominate us for their small business of the year. We also have had four years of INC5000 growth, which is pretty good for a government consultancy. I disagree with the OP. Tech doesn't cause success whether you use boring stuff or fancy stuff. There is no silver bullet either way. We happen to use a lot of fancy tech, but we made each choice based on an accounting of time savings. Our writing web apps in fancy Django+continuous integration+cloud saves an order of magnitude of time compared to boring java servlets plus typical migration process. We pass the savings on to our customers.
What it comes down to is that the major cost of new tech is learning. If a new technology lowers work, you're reducing a fixed cost (developer work). If the new fixed cost plus the amortized margin cost is lower, a new technology is the appropriate choice. It so happens that when I do that calculation on most new technologies (Node.JS for instance), there is not a large enough savings to justify the risk. For some other technologies (Django), the savings is so huge that we are able to offer profitable rates that are astonishingly lower than competitors. That lower price boils down to the fact that we do a tiny fraction of the work compared to our competitors to produce a superior product.
Saying that the boring choice is the right choice is a fallacy. Technology has for thousands of years driven improvements in productivity. Just because the improvements are smaller today than they were in the 90s or 2000s doesn't mean they aren't worth pursuing.
A true "rockstar coder" will know when it makes sense to do the obvious thing, and when there are gains to be had by doing something clever to save the day. This is why Star Trek is inspiring for many Tech Leads, they recognize that sometimes you should follow protocol, but when shit hits the fan a good leader can improvise and not let projects fail or staff get laid off through cunning actions and negotiations.
"BORING" (but proven, efficient, simple & effective) for: APK Hosts File Engine 9.0++ SR-2 32/64-bit:
http://start64.com/index.php?o...
FREE & adds speed, security, + reliability, doing more w/ less, more efficiently vs. addons + fixes DNS' redirect security issues:
---
A.) Hosts do more than:
1.) AdBlock ("souled-out" 2 Google/Crippled by default http://techcrunch.com/2013/07/... & ABP too http://finance.yahoo.com/news/... )
2.) Ghostery (Advertiser owned) - "Fox guards henhouse" http://en.wikipedia.org/wiki/G...
B.) Hosts add reliability vs. downed/redirected dns (& overcome site redirects e.g. /. beta).
C.) Hosts secure vs. malicious domains too -> http://tech.slashdot.org/comme... w/ less "moving parts" complexity
D.) Hosts files yield more:
1.) Speed (adblock & hardcodes fav sites - faster than remote dns)
2.) Security (vs. malicious domains serving malcontent + block spam/phish & trackers)
3.) Reliability (vs. downed, Kaminsky redirected (99% ISP DNS' = unpatched vs. it), DGA, Fastflux, & dynDNS botnets)
4.) Anonymity (vs. dns request logs + dnsbl's).
---
* Hosts do more w/ less (1 file) @ faster levels (ring 0) vs redundant inefficient addons (slowing slower ring 3 browsers) via filtering 4 the IP stack (coded in C, loads w/ os, & 1st net resolver queried w\ 45++ yrs.of optimization).
* Addons = more complex + slow browsers in messagepassing (use a few concurrently & see) & are nullified by native browser methods - It's how Clarityray's destroying Adblock.
* Addons slowup slower usermode browsers layering on more - & bloat RAM consumption + excessive cpu use too (4++gb extra in FireFox https://blog.mozilla.org/nneth...)
(Work w/ a more capable native kernelmode part you already have - hosts (An integrated part of the ip stack))
APK
P.S.=> "The premise is quite simple: Take something designed by nature & reprogram it to make it work for the body rather than against it..." - Dr. Alice Krippen: "I am legend"
...apk
if you have 3 lines of identical code in 3 places, it should be a method or function...
less than that you have an identical comment so your IDE can find you all the code when you start to change one of the instances...
Whether to go new or not should depend on how horrendous the old way of doing something was, AND how stable, well documented, and community supported the new thing is AND how many of the old way's fundamental problems/weaknesses the new thing solves.
It's not a simple decision, and needs to be made case by case.
What really matters is the quality of the technology and the community that is actively working with it, supporting it and improving it. Not the age.
Where are we going and why are we in a handbasket?
I have dealt with a number of DRY fanatics who seem to think perfect adherence to the acronym outweighs even having a program that does what it is supposed to do. People sometimes forget that their job is to solve problems rather than writing perfect programs.
Mathematics is not a science. Science is empirical, math is rational. Applied math can be empirical. Learn the difference and don't misuse the terms again.
Also, if you're going to talk about whether programming is math, you should probably talk about Turing machines and lambda calculus. E.g. Why is it important that programs are numbers? Answer: it's not, it's just one representation, and computation would still be just as effective if one used other symbols (per Turing). Programming is math because it is composed of mathematical statements, not because it is encoded with numerical instructions.
I don't think the article suggests mysql over mongodb in all cases (maybe for the simple case). I think the main point is not to use both.
You got me into this! You were the ideologue! I'm only a poor assassin! - Twenty evocations, Bruce Sterling
Exactly same is true of compilers, processors, etc.
(hardware is just frozen software.)
All practical programming, (beyond purely theoretical models or toy projects), involves using components that are not fully known, trusted or verified.
That's just life.
See subject: Zero (you know it, I know it - all reading do!)
* :)
(I love telling the truth about online scum like you...)
APK
P.S.=> Being a trolling "ne'er-do-well" online such as yourself, your entire life, is NO way to live your life, loser... apk
How about boring news?