Plan to write big software - and you have already lost
olabini.com
olabini.com
I can't imagine any sane engineer not realizing that writing say an operating system is on a different level of magnitude than writing some HTML peppered in with a little Javascript.
Edit:
"This is the reason I like agile. It emphasizes small, working pieces all the time. If you work with code this way, you can’t really become big. Instead, your project will be forced to be modularized and divided into smaller, more logical components that are highly cohesive and decoupled from each other."
Using Agile really doesn't guarantee you any of this. You're still very free to abandon separation of concerns and end up with a tightly coupled mess.
This is what I find usually happens with agile development. The software tends to start out small, but because it's not well thought out and because it tends to be rushed, even the small stuff becomes spaghetti startlingly quickly -- as happened on a current project, where after less than three months, we managed to cram THREE separate object models into a UI with a whopping TWO screens. (Imagine my frustration when what was six lines of code when I last worked on it now had over 500.)
It happens to the best of us, the feature creep, the must-haves, the rush to ship. So, does agile actually fail to address this, or is this something subtle that manages to evade detection despite better practices and intents?
Simple, nobody pays you to notice how much of a problem the software that works perfectly has become. They pay you to improve feature x by a very small amount, or to add feature y.
So, sure Agile works fine, in the same world that most every other methodology works fine.
It's not the methodology that makes good software, it's the people behind it.
This is a management failure, and you haven't been practicing Agile.
My experience with agile has been that most managers who seek to lead agile teams wind up equating rapidly typing code to rapidly developing software.
It's particularly bad here because in the process of telling every programmer with a different problem domain that they don't know what they're doing, he appears to concede that dynamic languages are not good for handling big projects...
For instance, I've been doing a good bit of playing around with Perl 6 this year. I think by this time next year Rakudo will be stable enough to make it an excellent choice for developing large projects where execution speed is not of the essence. But that's just a hypothesis, I certainly haven't done enough Perl 6 programming to feel confident in that yet.
If we're applying the argument to Perl, then sure.. I get it. With Perl, it's more a question of syntax. By supporting so many ways to accomplish the same thing, it can be very unwieldy when you have many programmers all exercising all of those options.
It's not a question of dynamic in that case. It's a question of a (in my opinion) fundamental shortcoming in the language.
However, languages like Python or Ruby both seem pretty well suited for large scale development. We've seen large scale projects written in both, and it works just fine.
So no, I don't agree with the fundamental premise that dynamic languages are bad for 'big' projects. If by 'big' we mean memory/processor intensive... well lets have THAT debate instead.
And likewise some software is big, period, regardless of the language used. The easiest way to measure the size of a piece of software in advance is to imagine the size of the test suite. I have a poorly thought-out idea about the minimal complexity of a software program being the complexity of the automated test suite that validates the program...
Anyways, some software is bigger than other software, but again that doesn't necessarily mean that given a large test suite to be satisfied and anticipating a larger program or collection of programs you necessarily need to discard certain tools that work well for smaller programs.
Steve Yegge made this point with a much more entertaining analogy: He talked about pushing dirt, which illustrated the fallacy with some tools that are espoused as being appropriate for large projects: namely that they are really good at solving the problems introduced by the tools themselves.
http://steve-yegge.blogspot.com/2007/12/codes-worst-enemy.ht...
My takeway from Steve's article was that if you avoided tools that introduce certain problems, you don't need other tools to solve those problems.
How did they lose? They operate successfully due to marginal costs on all fronts including their website.
I would like to hear some ideas out here on projects like Amazon.com.
There's a reason that they have such insane turnover so few people who stick around after they collect their signing bonuses...
Loose coupling should be possible but a rarely seen feat I reckon for websites of this scale.
I wonder how "loosely" coupled and well architected the 2.0 sites are like digg and facebook?
No you're not. You're optimizing a car that can survive running into a rock wall. If that's what the car needs to do, you're doing exactly the right thing. If, instead, it needs to get people places, or be fuel efficient, or drive over 120mph, then you're probably doing the wrong thing.
There are more than three vectors. "Good" could mean reliable, secure, highly functional, or many other things. Picking any three vectors and analyzing the tradeoffs helps to figure out how to apply resources.
It's almost like he's trying to prove the converse of his thesis. Not to be mean here, but he's a fairly junior level developer, he's a younger guy who done some things but not done that much. I've worked on some very large, highly profitable projects and we always knew use-cases and requirements long before we got in to the project. There are tools that allow not-great engineers to produce good stuff. There are also great engineers which are capable of dealing with the astronomic complexity of a large project and it turns out that people pay a lot more money for software that solves problems that they can't otherwise solve. If there is a simple solution that satisfies the requirements and beats the competition, then more power to you. Unfortunately, many complex problems have complex solutions.
I think the real thing that the author denounces is blanket statements like "this project will be big so we must use Java" without really thinking about the project's potential structure or the best language.
- Writing a web browser - Writing a professional image manipulation software like Photoshop - Writing a professional 3D modeler like 3D Studio - Writing an IDE like Eclipse Idea or NetBeans
and so on...
For instance: Browser - if you're going to start to build a web browser, it doesn't have to be huge... unless you're going to have your own rendering engine, your own JS engine etc... You'd probably just be addressing some set of features that were missing/misdone in other browsers Writing photoshop - what, are you going to remake all the features of photoshop? And do you think your software will be better? That's a fail. You'd probably be starting by doing some image manipulation program that does a limited set of features that photoshop can't do etc...
I get your point and I totally agree that if you _WERE_ going to remake photoshop, it's totally going to be huge... but that doesn't mean that it's the best path to go down.
However, there are a large class of problems out there which do require a huge chunk of software if you want to address them in any useful way. No matter what you do to reduce coupling between modules there is a certain level of irreducible complexity. For those cases you need to do a lot of up-front design work or you're going to end up with a huge mess. And no, refactoring is not the solution here.
But all that huge chunk of software will definitely be built using smaller projects - and the more independent the better.
There are other models for each of your examples that can reduce the size and complexity of the application (or at least spread it around).
No it wasn't...
"A lot of small things tied together intelligently is often better than one big thing."
Not every problem can be optimally fast, and also optimally sized for simplicity. As an alg coder of quite a few years of course I prefer and love simple easy to read, remember, and modify code. But then someone comes along and says, we need this fairly quick code, parallelized, ported to these other platforms, and faster than real time. Dynamically size and share memory as needed to scale to any number of available nodes, and have it driven by a GUI, but make those buttons overlay an elliptical earth model…..
As you can imagine, writing simple (and reusable) code is a desirable thing for programmers. Unfortunately we don’t dictate the terms and requirements, real physical systems do. Sometimes deadlines trump both of the above, and getting something to work, means messy throw away code. I guess we could all agree never to write software like that, good luck getting consensus (herding cats made easy).
From my experience I am only speak to the benefits provided by a statically typed languages as you try modularize the components. That isn't to say that a dynamically typed languages do not provide an alternative or similar benefit, I just do not have large project experience with them.
Not certain how he draws the causation from using agile to the resulting software being modularized and cohesive. It just is a case of correlation on the projects he has worked on.
Both the arguments for dynamic and static languages as presented here are vacuous.
Cars do get optimized for hitting rock walls (i.e. what happens in case of a crash).
They are optimized for keeping costs low, getting reasonable performance and gas mileage, and meeting government safety standards.
A car that is optimized for hitting a rock wall would get about 1 mile per gallon and have a top speed of 1 mile per hour.