What Makes Software Development So Hard?
lizzyben writes to mention that CIO Insight is running a short piece that takes a look at why the rocky culture of software development continues to exist despite all of the missed deadlines, blown budgets, and broken promises. From the article: "I was not really looking or thinking about big software projects. I was just coming out of my experiences at Salon, where we built a content management system in 2000, which was painful. I was one of the people in charge of it, and when the dust cleared, I thought, I don't really know that much about software development. Other people must have figured it out better than I have; I must go and learn. So I started reading, and talking to people, and realized it's a big subject and an unsolved problem. And the bigger the project, the harder the problem."
What Makes Software Development So Hard?
Why is conducting an orchestra so hard?
Push Button, Receive Bacon
Software developers?
You just have to have a good system and management if it's a large project. That's all.
Software is complicated, and obviously the larger the project, the more peices need to fit together, etc. I think a lot of it though has to do with the team involved - both the developers and management. It seems to me, there are lots of "developers" around who really have no business writing software. And even more self-proclaimed architects who really have no clue.
A bad process makes software development hard.
Poor specs, the dreamers from marketing, arrogant programmers, feature creep, unwanted input from people outside the process, lack of caffeine, and the users...oh the god damn users!
Totalitarian dictatorship and "hello world" can be simple if you work hard enough at it.
Writing the code from a good design is easy. It is creating a good accurate design, capturing all the requirements accurately and ensuring the end user's expectations are correct.
Viagara, Cialis, red bull, two brazilian hookers and a swiss midget.
I think the invisible hand of the market has its middle finger extended
--A wise old fart named SC0RN
That was a close one. If this was another Joel on Software article, I was going to have to promptly defenestrate myself.
"Nature doesn't care how smart you are. You can still be wrong." - Richard Feynman
Anyone can write a book. But, writing a book that's *GOOD* and that people will want to read is an entirely different matter.
Computer software is no different.
Treat it like an engineering discipline.
With science, you're observing and making measurements of the natural world and testing hypotheses to develop a theory on the how and why of nature.
Engineering, OTOH, you are applying natural physical laws to create a man made piece of technology or something.
Ok, here comes the Wikipedia cites on science and engineering from folks who are completely missing my point.
the goddamn users
Good software takes time to develop. There is sometimes a tendancy to set unrealistic goals and when they aren't met the people in charge feel let down.
In related news, humans still can't seem to bridges with any reliable schedule or budget. Despite the fact that bridges have been built probably since the dawn of man, and we've been building suspension bridges for at least 500 years.
my blog
First, the people who make the technology decisions often don't have the required technical know-how, and have a terrible tendency not to listen to people who do. OTOH, the people who have the technical know-how have absolutely no idea how to write a business case. Thus, there's usually a disconnect between the people who understand the business requirements, and the people who understand the technical requirements. Vendor loyalty has been known to be a sticky issue as a result.
Second, there's always a problem getting a bunch of talented, egotistical (ok, so not all software developers have ego problems...) quirky, eccentric and generally difficult people to work toward a common goal. The common analogy to being a successful director/manager of a software project is to that of "herding cats". My experience has been that business types don't react well to the often-emotional developer types, hearing the emotional outburst, but ignoring the content of it. Developers would do well to learn some more social skills, and director/manager types would do well to listen better.
mandelbr0t
"Please describe the scientific nature of the 'whammy'" - Agent Scully
practical application isn't so. Requirements change, clients see something and want something different. You work a month on something and find out it isn't working anywhere close to the way it should. Tasks are more complex then people thought at first, the list goes on. It is a complex thing with infinite ways to do things. It isn't any easy process.
...but, instead, they profile Charles Simonyi and his quest to "re-program software".
Read the article at Technology Review.
Synchronize your calendar and mobile phone via text messaging.
Slashdot makes it hard.
I find most of the issues that arise on projects are not so much that the developers are incompetent, but that no one sets realistic, or are not allowed to set realistic expectations. How many times does the business change the specs? How many times are the developers given more time to allow for the changes?
The last project I worked on had a hard deadline. We were in the UAT phase when the business decided it wanted a change. A big one. Despite the fact that we were mere days from production, we were expected to make the changes, test them, and still meet the schedule. IT managements take was as usual. The business pays the bills so the business gets what it wants.
Until IT management can stand up to the business side, software development will always suffer.
The opinions expressed here are not mine, but those of these dang voices in my head.
The reason it's hard is because we are doing the impossible, at least if you had asked someone 50, 20, or in some cases even 10 years ago. Solving previously impossible problems requires quite a bit of innovation and novel thinking. But, it's better than it was decades ago, even if it is difficult. What we need to remind people is that even with fast computers, the problems are still difficult to solve.
Also, automating tasks that we used to perform ourselves is also difficult. It's one thing to walk and chew gum, but another thing entirely to precisely describe the mechanics of doing so. (One is very easy, the other requires creating precise models of how things work, a very hard problem).
What Makes Software Development So Hard?
Simple. The current state of technology in regards to human imagination makes it many times easier to think up of good ideas or improvements for computer software than it takes to create or implement them. Thus the requirements for developers are often made by the ones with the ideas with no idea of the costs (in terms of time or money) involved in making those ideas a reality.
Joe Sacks says "Gee, it would be a great idea of our flight tracking program also tracked fuel usage and recommended fuel loads to minimize weight on subsequent flights". See? It only took Joe all of about three minutes to think that up. He figures that a reasonable amount of time to implement this idea is one or two days. After all, those "computer guys" are pretty smart and can "do anything".
Two days later Joe receives a report that the "project" is over budget (needed to check with the FAA on this one, that cost money) and overdue.
Sure, you could just say that these problems need good project management. But seriously the problem is that these "problems" are not considered worthy of project management. It only took Joe three minutes to think the idea up...why should he hire a project manager for *THAT*. It's not like he's building a new hangar.
First the wag: The idea that the interveiwee states early on, that software development is not introspective, is horse-hockey. We think about it all the time. We invent new, clever ways to diagram software, capture requirements, interview users, validate functionality and come with all sorts of certifications. More than, say accounting, we are process focused people. Maybe our processes suck, but we spend a lot of time, energy, certification exams, etc, on those processes.
Tip of my hat: He does mention starting small and iterating. I think that's the best way to build software.
Leave the gun, take the cannoli -- Clemenza, The Godfather
Rarely can a single person manage all of the details. Coupled with the generally poor estimating skills I've observed at all levels of staff and management, technical and otherwise, significant portions of projects tend to be guesses. Granted, usually educated guesses based on a certain amount of information, but ultimately still guesses. Getting management and users to want to have the patience to quantify everything is all but impossible.
What makes software development so difficult for me in my particular case:
1. Requirements are not clearly defined
2. Requirements that are defined change constantly
3. No existing documentation on the system I work with
4. Outdated technology (Not a big issue, but many things are just easier to do with newer software)
5. The sales department sells features that do not exist, promise a date, and do not consult IT at all about the feasibility or time estimates
4 out of the 5 things I have listed above have to do with bad information / lack of communication.
Love sees no species.
Pre-planning Prevents Piss Poor Performance
It's hard because of stupid people. I swear, users get increasingly more challenged as time goes on. An incompetent user would rather push the wrong button and see what happens then read anything. My new system is fool proof; each button will be a color coded geometric shape....
It's not just a thought, real world code is so repulsive it's almost unbearable. Software, like art cannot be forced and the world is only interested in paying for cheap prints sold by marketoid parasites. Often the more aesthetically pleasing app is superior in the mind of those holding the purse strings. Microsoft know a thing or 2 about software in the real world, Superficial enhancements for the win.
The first reason is the complexity of the systems. There are essentially extremely many interacting parts that cause all sorts of emergent phenomena. This is a field that we don't really know how to handle very well - good quantitative models of complex systems simply don't exist. We need more study of systems theory and chaos theory to build some form of predictive models on which in turn can base planning.
The second problem is a sort of 'freedom of thought' culture that sees coding as the vaguely mathematical expression of ideas. As there are a huge number of degrees of freedom most attempts to regulate it in practice have been abandoned. So instead of just the problem of describing a mathematical problem, you throw individual human preferences, thinking and biases into the equation.
Of course it can't continue that way forever and we need to move to a meta level of coding. We do have well-constructed systems, such as the software on-board an airplane - but they are laughably primitive (because you have to account for all possible states the software can get in to). And we have advanced software, but it is laughably unreliable.
Still, there is reason to be hopeful. We're not inventing the wheel every time any more (just the horse carriage and so on). Modern programming systems have extensive class libraries that are on average a more stable foundation than making a custom implementation from scratch every time.
Ultimately however we need to know how to handle complex systems and how to enforce convergence/stability to systems where the huge number of possible combination of states can be analyzed. And sad as it is, if we want it to be reliable, the liberal individual approach to coding has to be abandoned in favour of a much more strict industrial way of thinking. Right now we have handcraft and we need industrial precision, standardization and quality.
I would be out of a job ;)
I would reeeally like to see your code. Seriously. Then we could have a flamebait style code-review just like your post, where we humiliate your coding skills (if existent in any form at all)
What is the pedigree required to build a large bridge, a skyscraper, a rocket, or to perform brain surgery?
Right now software engineering is such a young field. Success isn't dependent so much on process and education as it is on the skill and intuition of individual developers. And there are a heck of alot of software developers out there with neither education nor skill
Software engineering is still becoming it's own thing. I mean, we still keep trying to compare building software to building buildings. We're still pounding things with rocks, but the difference between software and things in the past is that it's so easy to get something up quickly that is moderately useful.
We'll get there.
Help me take back Slashdot. When did 'News for Nerds' become 'FUD and Conspiracy Theories for Extremist Nutjobs'?
Part of the problem is this; When asked if we ( software developers ) can do something, the answer is typically yes; Of course we can do something. Given enough time and money, we can write software to accomplish just about anything. The problem lies in that we may not have experience in that field, or we do but this request is different in a way to make it difficult.
Software development is a lot like engineering, only without the hundreds of years of experience to pull from. And it's a lot like janitorial work, only without the experience to draw from there as well. Managers, marketting ( and schools really ) like to see it like a burger to be flipped.
Mod me down with all of your hatred and your journey towards the dark side will be complete!
When you ask a carpenter "are you done ?", almost anyone can verify the answer just by looking at it.
When you ask a programmer "are you done ?", it is difficult to verify the answer.
There are so many ways to accomplish a goal in software that you need a number of very expensive controls in place to validate the result. Very few managers know how to do it and very few C*O's are willing to spend the money to put in place even the minimal control measures even though I can say in every case where ther were good controls put in place the benefits far outweighed the costs.
This leads to a plethora of problems that I won't repeat here but I know too well.
Eventually everything breaks down when the C*O's start making technical decisions that they are not qualified to make and it's all downhill from there.
There's a whole industry of dev tools out there trying to convince management that SilverBullet will make your software come out on time, or make your crappy programmers more productive. I don't think so.
What we really need is to promote the concept of the CodeSmith like a balcksmish, silversmith or whatever, coding is a skilled artisan occupation. Instead of trying to keep good coders coding, most organisations try promoting them and making them managers. Eventually you're left with just the dregs coding.
Engineering is the art of compromise.
When you've contracted an engineer to design a bridge, and you want to make several large-scale changes to that bridge, the engineer will come back and say "If you want these changes done, this is how long it will take. If I don't have that much time, I can't make the changes".
In fact, I'd go a step further; software developers tend to say "This is how long it will take to make the change, and this is how long it will take for me to hack something together." Bridge engineers don't say things like that. They don't put that "hack something unsafe together" option out there on the table, and neither should we.
I think one of the biggest problems in our industry is accountability. The engineer would never put the unsafe option on the table, because the engineer knows he'll loose his license and go to prison if the bridge collapses. With software, on the other hand, we just expect our customers to deal with the fact that it fails, and we behave accordingly - and unprofessionally.
Complex subjects are... ummm... complex.
Every day there is more software created that makes creating new software easier. We're still in the toddler phases of computing. It will get better as computers get faster and have more storage. Even if you combined all the computing power in the world it's still pitifully slow in the grand scheme of things. Compare biological functions for example and the amount of computing power it takes to model even a single atom (and that's without even modeling the quantum state... and whatever is smaller than the quantum level...etc).
As a medicinal chemist I second this.
the NPG electrode was replaced with carbon blac
The answer to this question isn't complicated. Software development is hard because it requires that the developers impose an artificial abstraction on the real world -- a real world that could be conceptualized in an infinite number of ways.
Once you decide on some particular conceptualization, you make certain assumptions about what is and isn't possible. This is the root cause of most if not all of developers' headaches. Despite our best intentions, we find that our carefully engineered abstraction does not capture everything about the real world relevant to the given task (either because we got it wrong the first time, or because the task itself has changed).
This, in fact, is a deep problem in computation in general -- a huge obstacle in artificial intelligence, for example. We need an algorithm that can pick out the salient aspects of a problem and ignore the irrelevant ones. Until the day that we have this (and that day may never come) the hard part of software development will remain an art form based on intuition and creativity.
I see more projects go bad because of poor communication and lack of architectural efforts than anything else.
A sufficiently detailed question needs no answer. Likewise, with software development (and really most computer systems development), everyone wants to rush out and start coding as fast as possible...but if they'd made sure there were no assumptions, defined their problem specifically, and spent way more time than they wanted to developing an architecture, the coding afterwards would just be data entry for the most part.
But...people tend to be averse to taking the up-front costs of not only gathering their requirements, but also -understanding them- and making them -fit together-. Frameworks and Architectures tend to be poorly developed and understood ahead of time. Features are developed in isolation from each other. Test cases need to be developed at every step to keep people in agreement and to make find issues early. If your project isn't working in a manner where every new addition to it can't be tested as it's written, you're doing something wrong.
Requirements need to be reviewed and revised and reviewed and revised constantly with all staekholders against those test cases.
But...maybe I'm off base.
Software development isn't really very hard today. At least not at the level at which 90% of programmers work. The tools mostly work, many of the languages are quite forgiving, there are plenty of books, you can get help from Google, and much code can be downloaded. Yes, there are people doing hard stuff - real time control, database internals, game physics, stuff like that. But ordinary web programming is almost a no-brainer today. Look at the people doing it.
And if you need to do something hard, it's amazing how much one person can get done today. It's a great time to be a serious programmer.
There are design problems, yes. Microsoft's world is overly complex because they need it to be complex; if it were straightforward, nobody would need Microsoft. The Linux/Unix world is overly complicated because it has too much legacy dating back to the 1970s. The CSS world is overly complicated because the approach to page layout was botched. (Layout is a constraint problem, but isn't being approached as one.)
What we do have is too much tolerance for the mess at the bottom. What we need is, say, a "Just Say No to Bad Software" from Fortune 1000 CIOs. As in "We're not buying Vista until this list of problems is dealt with".
Three reasons I see regularly that cause development not to be delivered "on time" and "on budget":
- Specification - specifications given to developers are always incomplete. Something always gets left out, from subtle behaviours to business logic for whole subsystems.
- Scheduling - although we're working on changing this, other people who have no hands-on development experience set the schedules. They either use some metric about lines-of-code-per-person-per-day that has no relevance in the real world, use a dart board, or just pull the figures out of their proverbial. (I'm thinking the last.)
- Integration - Green Fields development is always easier. Extending old systems is always a pain in the proverbial due to the lack of accurate documentation. Even the perfect documentation becomes imperfect if it isn't kept up to date (or nobody knows where it is).
There's heaps more, but this is my top three.I think that a big part of the reason that software development is difficult, is that people don't have, or don't follow a program development process. At what stage is the data definition and data flow analysis done? Before coding starts? After? Are there milestones in place, specific points at which progress is measured and design changes made? Are these planned for and documented? How is this program related to others? Is there code from other projects that can be re-used? What parts of this project can be re-used?
When our name is on the back of your car, we're behind you all the way!
We promise according to our hopes; we perform according to our fears.
Managers -- down to mid-level -- need to have dates, so the programmer gives the earliest possible date. The software goes out buggy, untested. More pressure on the programmer and management doesn't trust programmer estimates anymore.
Solution? None, with the current business model.
Official Pi Ambassador -- inquire for details!
Software is still a Science and not an Engineering practice.
As long as the design can also be the implementor and estimates based on actual analysis are optional, Software will NEVER be an engineering study.
These aren't changing quickly for what I believe are a few reasons:
IEEE has not created a Professional Engineer - Software and noone really wants them to.
Companies don't like to be told they have to hire something that sounds expensive to build something they cannot see.
Companies will NEVER open their software to outside inspection the way construction companies must open their buildings because of the concept (flawed, I think) of Intellectual Property.
If a company had to have their software inspected by a Software P.E. before using it in production or selling it to end users - If Software P.E.'s had to adhere to standards which included concrete estimates and testing - If companies were not allowed to use anyone they could find that has seen a computer to write their software... commercial software development would be much further ahead.
Do I believe any of this should happen? No. Why? Because I want it to continue to fail. I do not believe software development should be put on a pedestal or only performed by "experts". I believe shoot from the hip software projects allow open source software projects to exist and to succeed in the market.
Open source works without accurate estimates because the contributors can flock to good projects and don't have to adhere to a labour budget. Company employees can't get wind of the cool software project and leave the crappy one's - corporate structure and budget's won't let them.
I don't believe companies with more than 120-150 people are stable - once they breach this range empire building occurs and massive uncontrollable monsters result. If a company truly needs more than 150 people it should split into two and partner on the project at hand. I believe this is a human condition - humans work best in tribes where they can personally know all of the members.
All of this might be completely and utterly wrong. But it's my hypothesis.
You are checking your backups, aren't you?
What I've always seen in college classes and books on methodology is that there is some mythical "requirements" known in advance but in the real world I've never, ever seen any project which actually has known requirements and sticks to them over the project. I guess software development would be easy if that were the case. What usually happens is as the software is developed, requirements emerge and diverge and go amok during the time it takes to develop the software. Not true in other fields: When you've got a die or something you pour stuff into, you aren't going to change it after you make a few widgets. You're not going to port your die to Oracle after casting it for DB2. You're pretty much stuck, and if people don't like tail fins that year, you've got to start over from scratch. Software isn't like that, and any known methodology from engineering and science breaks down. The closest thing I've seen that works is some of the agile methods that say deliver as little as possible as soon as possible. But even that doesn't tell how to do it. What I have discovered is that the best way to meet changing requirements is to build applications with an object model that does the base functionality and a scripting language like Python to drive it. Then, as new requirements emerge, you can mold and shape the object model into new "applications" using the rapid-development scripting language. If the user wanted a desktop GUI and suddenly wants a web interface - if the user wanted a GUI but now wants it to run in batch - if the user wants something new no one thought of six months ago - whatever, the scripting language makes major changes much easier as long as they're not asking for big changes to the basic object model that does what the application does. (Or, you can add new stuff to the object model without breaking the working scripts.) Push the changeable stuff off into a scripting language that makes it really easy to change stuff, and write the guts of the app in your core language like Java or C++. I don't have a catch name for this approach, but it's worked remarkably well in practice.
What Makes Software Development So Hard?
It's all that goddamned thinking you have to do.
MjM
XKCD:Xeric Knowledge Comically Dispen
Software design and development is more akin to an architect designing a building rather than the more common analogy of building the building once it's designed. Except that software developers are often burdened with requirements that any architect who valued his license would reject. For example, management often dictates which parts are to be used (ie. "We're going to use MS SQL Server as the database engine."). What architect would design a skyscraper after having been ordered by the client to use pine 2x4s instead of steel beams, or design a 1-story residential house under the requirement that he use titanium box beams instead of 2x4s? And then there's what the article notes at the top of page 3: software requirements change right up to the day of release. When an architect goes to design a building, the requirements are fixed before he starts. Square footage, height, number of floors, number of people each floor has to accomodate, number of elevators, number of toilets needed on each floor, how high the ceiling of the lobby floor will be, all that's fixed in stone before any design work begins. Sometimes that requires back-and-forth between the client and the architect to get everything clear, but it all happens before major design work begins. No architect's going to design the foundations of a building until he knows exactly (or at least very very closely) how much mass is going to have to sit on those foundations and how much horizontal shear they're going to have to handle. If the client can't decide what he wants, the architect just goes "Fine, call me when you decide what you want.". And even when this kind of analysis is done, software requirements change constantly after design's started. See above, no architect's going to accept the client changing the number of floors or the square footage of floors without also agreeing to a complete redesign to accomodate the changes with all the delays and additional costs that requires. If the client didn't like it, the architect would just hand the client the work to date and tell him to have a nice day. And no there wouldn't be any refund of money, the architect's held up his part of the deal as best the client will let him.
And then there's another parallel: architecture is only half engineering, the other half is art. Every building is different, and it's accepted that the architect's going to have to have time to come up with the parts that aren't off-the-shelf standard. There isn't a single standard floor-plan for a single-family 3-bedroom house, there aren't any rules that can be mechanically applied to create a floor-plan, and it's accepted that the process of creating a floor-plan is more creative than anything else and people without the knack for it just aren't going to be very good at it. And that on the next single-family 3-bedroom house much of that work's going to have to be done over again because the new client doesn't want the same thing the previous client wanted.
Writing good software is hard because while the result is just a tool for a job, identifying the job can be very, very difficult. Sometimes it's like planning to create a square peg for a hole that may or may not be circular, and whose circumference might no longer be known in six to twelve months.
Management should re-evaluate the project at every stage and choose 2 out of following 3 to make sure it gets done .... Quality , Time or Money.
For good Quality product to be delivered on Time - you need to make sure the Price is right!
For a good Quality product which Costs less - you need to make sure you have enough Time to develop it
For a Cheap and Quick product - you will have to compromise on Quality
... of all the hot babes running around the offices in miniskirts giving massages that make it tricky to type. That, and the martinis that keep spilling in the keyboard. Combine that with the constant parties, sailing trips, ski trips, etc and it's a wonder anything gets done.
.com bubble anymore? Glad I left software.
What's that you say? It's not the
I believe that these days there is a gap between the kinds of concepts that you learn in computer science, which are mathematical things, and the everyday social problems that people are trying to solve with computers. It was summed up nicely a few years ago in a criticism of open-source software someone on the internet -- someone was complaining that the developers of GNUcash were dealing with memory leaks. I think they were using c or c++, and the complainer was saying they should migrate to java or python or something. If you're trying to make a computer program to solve problems, it's a waste of time to be solving computer problems. You should be solving the pre-existing human problem.
Every tool has its own problems. One problem is accounting, or keeping track of money. With pen and paper, you can run out of ink or paper. Humans aren't good at adding numbers in their heads. With computers, you can completely erase all of your work with a few clicks of the mouse or keyboard. So there are ways that problems inherent in the tool can emerge, which take energy and attention away from solving the pre-existing problem.
Currently with computers we are trying to abstract problems such as banking and business into simple logic puzzles. I think that's too much of a simplification. I think we need to create a virtual world full of basic human-percieved concepts, such as time, weather, humans, animals, etc. and create programs by manipulating those basic ideas and objects.
An example is an ontological system like OpenCyc. An ontological system holds hundreds of thousands of logical assertions like "Animals eat Food" and "Paris is the Capital of France". Basically, an ontology system has some basic common sense. From all of these assertions, it can make logical conclusions. So, if well tell Cyc that Duke is a Dog, it can conclude that Duke has a tail and eats food. If we tell it that Duke lives in Paris, it knows that Duke lives in France.
Now imagine, instead of dealing with animals and where they live, it has a bunch of assertions about generally accepting accounting principles. One day, you might be able to just sit down and talk with an ontological system via email or IM, and say, "We got a check from client A for $575, another check for $440." and then the computer balances the books with all the other accounting principles it 'knows'.
Current programs seems to be exclusively a digital re-creation of paper-based forms and filing cabinets. It's a sheet of paper with a bunch of field:value pairs, and reports are the resulting logical operations you can do with all of that data. This is *basically* the relational database. I think we are hitting the limit of the field:value model of reality. I think there are other models, such as virtual realities like online worlds, knowledge systems like opencyc, etc.
Programmers are working exclusively at too low of a level. Yes, of course, we will always need to teach and understand basic boolean logic and computer science terms, but we need to start working at higher-level, human friendly concepts.
Computers are useless. They can only give you answers.
-- Pablo Picasso
BLOAT - Look at J2EE and COM.
.NET (posted a year after .NET was released), Must have experience in Java, J2EE, J2ME, J2SE, JAX, JNI, JWD, JQV, WWJD, SOA, SOL, SQL, SPL, APL, OBE, CBE, ... (see point one) and AN EXPERT IN ALL THE ABOVE.
EGO - Noone will admit they don't know what they want, noone will admit that what they wrote thet were learning while they were coding it, etc.
GENERAL CLUELESSNESS: Figure out what you want and build it. In that order. "If I don't write down clear specifications I can't be held accountable if they're wrong" is the manager's mantra.
MAGIC BULLET THEORY: Technology X will solve all our problems! And our neighbour's problems (see first point)
HR ISSUES: Must have 10 years experience in
Corollary to the above: don't hire someone with a clue who architects well and can translate the design into whatever language you want (or tell you why "object oriented" and "EJB" don't co-exist) find someone who either guesses the exact answer to your clever pointer question you thought was a cool hack, or find someone with tons of certifications and ultrageekery in the language du jour (the GOLDEN HAMMER antipattern)
--- Jump!! Fire!! Bullet time!! - Lego version of the Matrix
I'm a sysadmin and not a coder. Scripts make sense. Do this, then this.
3D Matrix? Pointers? Sorry but those things confused the living hell out of me.
I took C++ in college. It was nice and fine. I understood it but after getting stuck on syntax, lost commas, single quotes and pathetic "Hello, world";. scripts it just lost ALL the magic.
My cousin does some high end 3D world modeling (and math) and he got turned onto it. That's why it is hard: our brains are wired differently.
Home builders have architectural plans. Machinist have blueprints. Electronic equipment builders have schematics.
Software engineers are stuck trying to figure out the incoherent ramblings of marketing/sales/business analysts/corporate executives/users and a host of others who have no means to specify what they are asking for.
Software specifications are uniformly deplorable.
Linux is a large project. It was managed effectively with no source control and no managers for years. If that's what you consider good management and a good system, I might agree with you; but somehow I don't think that's what you were saying.
Too much Management and Systems *ARE* what makes software hard.
two words: The DarkRoom
OSGGFG - Open Source Gamers Guide to Free Games
What makes software so hard? The enormous complexity of the software constructions.
Why is it so complex? Because it's so EASY to build it.
Example: Pre-computers, the moment-to-moment computations necessary to run an automobile engine were performed by mechanical devices, mainly the distributor and carburator. Every term in every computation was manufactured as a number of physical components, several of which are moving parts.
For instance: The RPM input to the spark advance was computed by two weights on pivots, with springs and stops, rotating a sleeve on a shaft. The shaft was driven by the camshft through a gear and the sleeve carried the cam driving the contact points or (in an electronic ignition) the starwheel that passed the sensor coil. Adding this computation (compared to no RMP spark advance) added five moving and four stationary parts, to be assembeled, and a test stand the volume of an office cube to test the result, and allow a worker to adjust the constants by bending the spring supports with a screwdiver.
In software this computation can be done by PART of ONE line of code. (In real engine controls it's actually done by more - mainly so the computation can be more complex and thus better approximate ideal running conditions.)
Software changed the game completely: When adding a piece of a compuation requires a moment of thought, a minute with a text editor, and issuing a compile command (plus whatever testing is necessary to convince yourself you got it right), rather than months of an engineer's and draftsman's time, manufacuture of dies, lab work to check the result, repeat through three layers of departments (to prove it can be done, to prove it can be done reliably, and to prove it can be manufactured affordablly), the amount of work and time to implement one bit of complexity reduced drastically.
The result was that the amount of complexity that can be afforded rose in proportion. Given that the proportion was hysterically large, the amount of complexity handled by each person became enormous.
Unfortunately, programming is NOT formulaic. Portions are - and as they are identified they are rendered into algorithms and software is written to perform them. The result is that the part people work on is ALWAYS the part that is "fuzzy" and difficult to formalize.
Programming consists of rendering a set of requirements into a correct specification for meeting the requirements. (The reset is automated.) This is not an easy task - and it gets more difficult with increasing complexity of function. Unfortunately, methodologies for performing it have remained in a catch-up game: The better the tools, the more complexity a worker can handle. The more he can handle, the more he is assigned.
To quote McClary's Third Law of Computer Technology: Software complexity expands to exceed the capability of any software development methodology.
Bantam Dominique roosters crow a four-note song. Once you've heard it as "Happy BIRTHday" you can't NOT hear it that way
The Bay Bridge is an interesing parallel -- the delays have been caused by unclear and shifting requirements (which are focussed on the aesthetics). These changing requirements have led to delays and cost overruns.
The real "Libtards" are the Libertarians!
Oh, about 1/3 to 1/2.
Some people can, some people can't. Unfortunately they're all in the IT industry.
The automated development platforms that apparently make someone off the street into a programmer are at the base of a lot of bad code.
Official Pi Ambassador -- inquire for details!
What makes software development so hard?... What makes anyone think software development should be easy? It is simply an inherently difficult job that very few people are truly talented at, just as with any other inherently difficult job. All of these people who think software would be easy if people just followed process X,Y and Z would cause Fred Brooks to spin in his grave... if he were dead.
IMO, Delphi is still the best and fastest option available.
Management who is more concerned with the process than the product
Management who never met a feature they didn't have to have added
Management who sets rules for design lockdown but permits themselves exceptions
Management who never seems to discipline those who don't work but loads obligation upon obligation on those who do work
Management who is more concerned with initials on parking spaces, titles, and new furniture.
Explains our 3 year project currently in its 6th year with 3 more years scoped out !!!
* Winners compare their achievements to their goals, losers compare theirs to that of others.
as our brains provide very fuzzy solutions to problems and tend to just think about what we have to do, rather than handling all eventualities.
I talk to a customer and come away with an idea of what they want to do.
I write a High Level Design - and it makes sense and everybody is happy. I've basically just written down how we think.
The tricky part starts when you break it down to the low level. The questions start to come up:
What happens if that's that?
How do we stop X
If we have Y & Z htf do we calculate blah (without locking the db for a week)
Now when you think you've got the low level you then still forget stuff, implement a feature in a less than idea way blah blah.
Then the spec changes and you through band-aids all over the code.
Oh I could babble on for hours about this.
Another way of looking at it is to think of Chess. The objective is simple - to win with check-mate. The rules are simple - this piece can do this, this one can do this. The problem comes with the bit you have to fill in in the middle. The all but infinite permutations are there, so there is rarely ever a 'right' answer at any point. Some options are obviously better than others, but at most points you can never definitely say that was the absolutely best option. Pulling customers back into it, if you suddenly find a piece 20 moves back's just been fiddled with, you're screwed.
Just one last mention of customers, they often get a harsh deal from developers. Developers only see a small part of what customers actually 'do' - but tend to walk away assuming they know everything. Most bugs seem to arise when assumptions are made by the developer.
You can't master the tools you use if they are constantly evolving. Case in point dotNet 1.0, 1.1, 2.0, 3.0 all within a span of 5 or so years. Yeah you the fundamentals (design patterns) stays the same but vendors such as MS try their best to obfuscate the basics by providing layers of "code generators" which are suppose to to make it easier for developers but in reality does the opposite. For example, how do you migrate generated code to the next version when the new tools come out?
But not what I want.
The problem is that no one takes the time to really analize what it is the customer "needs" and how they will "want to" use it.
Once this is done creation of the design document and coding is easy.
Undetectable Steganography? Yep, there's an app fo
(1) MBAs who do not understand technology. They think of software s widgets and they expect software developers to "convince" them that one way is better than another, unfortunately, the gulf between what management knows and what it needs to know to make that decision is too vast. The MBA can't understand the reason and blames the developer for not being able to explain. This is frustrating because sometimes it takes years to understand something well enough to make decisions, but MBAs think they can be briefed.
:-)
(2) MBA negotiation. A software developer with some experience can make a good time estimate, but when the proposal is made, the management of the product says that's too long. So, they start creating hypothetical scenarios about better machines, more people, different specs, etc. until they reduce the time estimate. so, surprise! it takes longer.
(3) Bad developers. some developers just need to leave the business. they started in visual basic and have no interest in computer science or "the craft," the hack stuff together and say the things managers want to hear. Management likes these people and makes them project leads, then they get fired and move on to new unscrewed companies as "project leads.'
(4) Bad managers, some managers just don't know how to bring productivity out of people. when people are behind, they don't need nagging, they need help and they need an environment where they can talk about it.
(5) process over results, nuff said.
(6) Not enough process
(7) Bad specs. A product spec is like a writing 'outline" it should be complete enough to know what to do, but be concise enough to give the developer the room to do it. specs that are too loose or too rigid make development difficult. During development, there is no possible way for a spec to encompass 100% of the possible problems, but there should not be too many surprises.
Well programmers dont listen to users, instead they listen to the one who pays their bill, he's often not the user who will use the software. Probaply he's an interim manager with different targets. So when the product is finished and the people should start using it there is often a to big mismatch, to much klicking everywhere and a teribble GUI. And most likely you come close to a product which allready exsisted but seamed to be more expensive in the beginning (later all changes and fixes make it a lot cheaper probaply..) So also take a damn good look on the market to check if something allready exists. As real breaktroughs of new software are rare.. Hack even distributed mp3 downloading is an old idea. So you realy think you have something new ??? Next.. People poorly organize, themselves have difficulty to explain their isseu to a programmer and the programmer well he just has to finish something. He simply hits real problems (sad he missed that math lessons). Advice go to the users dont think of anything stay open to them. Let them draw on a drawing board what they would like to see. Then after that part start programming, when programming use technology that the company is planning to use also after your product, probaply something they can support themselve. If they understand VB or C+ or C# or whatever stay with that. If they have SQL dont force to use a lotusnotus DB or MYSQL or whatever. Use current (but not outdated) technology. Ehm sorry to say MS quite future orientated and all their products mixup quit reasonable within their programing environment. So it might be handy to use that. Ofcourse you could bringin linux and your assembler knowledge combined with an oracle DB, would probaply use smaller code, but how easy would it be to extend or fix that code.. Ooooh and learn to program in multiple threads dont have that single process halting your performance because now in real life it has to deal with 50000 records instead of your theory test model who used 100 records. Understand the performance of the hardware talk with System engineers. I'm a guy like that and sometimes work together with a programmer because of a performance issue in their software.
I know you're out there. I can feel you now. I know that you're afraid. You're afraid of us. You're afraid of change.
+5 funny/insightful
- Testable means that each and every module can be tested independently, which normally implies no side-effects (not an absolute demand, though). I always write a test section for each module and make the tests cover as many parts of the code as possible (hopefully all sections of the code, but for slightly complex modules this may be infeasible or even impossible).
By sticking to these rules and by documenting the code thoroughly, coding does not have to be too difficult. These rules/principles, I know, are part of some of the major design methodologies, but you do not have to make it more fancy than this to make it work. The above principles are very hard to retrofit into existing (legacy?) code that was not built this way, but extensions could still be made in a modular way that, if not to the letter, then in principle, adheres to the rules.I've been writing software and hacking hardware for nearly thirty years. It used to be much easier to write software. The machines were less capable and the software environments were less capable, and yet making software was easier.
Why?
Imagine you are one of the current software industry IP exploiter/plunderers: a senior manager at a large computer software/systems company. Your company didn't create computing nor invent most of the foundational technology you now control, leverage and profit from. You have a huge staff of marketers, managers and engineers to keep busy and an array of divisions and product lines. You have other smaller companies and open source initiatives nipping at your products trying to compete and share some fraction of the market. How do dominate the market? you protect your turf... You make the development environment and the software itself as complex as possible and influence the key hardware vendors to do the same. Why? so it takes a huge staff of engineers to do anything useful. That way that the cost of trying to compete exceeds the value of a competitive product, discouraging such competition. In order to take over certain product sectors, you under price products in that area while over pricing products where the competition is now extinct. When the new product sector is dominated after a few years, that becomes a new product area you can over charge for while under charging for some new sector of conquest.
The real problem with this "complexity as a weapon" strategy is that people who are making totally unrelated software, like most of us, have to suffer with insanely complex, poorly designed and not refactored, unreliable, no real time guarantees or QOS, barely interoperable, no security to speak of... systems and development environments that compare very poorly to 30 year old mainframe/mini technology.
Is this a conspiracy? or is this just a habit that happens to serve the very powerful and disempower the rest of us... YMMV
One day the motivation for making products and services will switch from "Winning" to "Serving" and on that day I will CHEER!!!
SimBuddha
Slashdot. :(
There have been successful small software projects and successful large software projects. Good software ~can be made~ and ~is made~. Sometimes it's because of a tremendous individual effort. Sometimes it's a tremendous group effort.
Good software can be made. But building good teams and protecting them is very difficult in a world of self-consolidating middle-managers, overpromoted beancounters and confused Senile Management. This is where everything goes to hell in a handbasket.
Oh yes, then there are the consultants.
Most companies need to be protected from their internal incompetence, power struggles, and misplaced faith. It's really no surprise that on average, the modern dysorganization is a disaster at making good software.
There are a few exceptions. In general, good things come from small organizations or ones that have a clear authority and are guided by a few people who understand how to manage, how to inspire, how to plan, how to delegate, and how to code.
I'd like to continue this discussion but I have to prepare a Powerpoint presentation.
Rich And Stupid is not so bad as Working For Rich And Stupid.
Very funny. Wow.
... well, otherwise it would be simple. Right?
OK, really now. You don't actually believe any of that, do you?
Given that Open Source development would be completely outside of the conspiracy to make things harder, any Open Source development should be orders of magnitude simpler than writing something for Windows. The APIs would be simple, clear and well documented. Everything would be much simpler because it could be and nobody would be pushing back to make it more complex.
Unless of course Richard Stallman and Linus had been somehow bought and subverted. Yes, that would explain it - obviously Open Source development is just as polluted by greedy CIOs to make it more complex because
A good programmer (especially a consultant) comes to the job with maybe HALF the knowlege needed to complete it - plus the ability to quickly learn the rest.
Actually it's more like 85%. But you get the idea. B-)
Bantam Dominique roosters crow a four-note song. Once you've heard it as "Happy BIRTHday" you can't NOT hear it that way
I found a bug! Skill, Talent and Knowledge are four words.
arrogance and lack of communication, from anyone in the development chain. Of course in any field of endeavor these two factors only make life more difficult, they just seem to manifest themselves in software development more often.
because you pussy fucking bitches eat the dog crap the vendors sell you. no one has gotten off their ass and made the infrastructure, we rely on re-implementing the awful cruft vendors excrete where we should be making distributed information spaces ripe for modification and mashup. the only ones defining rules and pushing outwards are vendors, and linux is left focused on pussy 1993 shit like making a nice pretty desktop and clean installers. fuck that shit, thats catching up, its old hack low level crap thats irrelevant to the information war taking place (xgl aside) and most importantly it will never play a single step in creating better technology. its pure implementation, no tool advancing. right now, the vendors are defining the verbose vicious hideous standards that will dictate the rules and ethics of our online existance. i blame all of you and your worthless desktop projects for not turning the internet into a viable medium. we need the compelling rich mashup based extensively hyperlinked peer to peer environment before coding becomes an act worthy of being done. right now we're coding in sludgepools, isolated little worlds that pull a couple libraries together to dredge up a single interface for a single user. its trash and its shite and it sucks because the environment sucks, the environment is literally 18 inches in front of you and no where else. code needs to get the fuck out of the constrained shit hole of the application and become mobile. across the network, code has a purpose. some day it will all be self evident, that the code sucked because the environment sucked. get the fuck off the desktop, start building something pervasive, and stop fucking wasting everyones time. before the vendors fill our gene pool with any more feces. i blame you all. you started an asymetric competition and then competed directly against the lowest common denominator available. the desktop is a worthless god damned endeavour.
go read Data Trash. figure out whats being said. and tell me we're not just the bitch of the corporations. AND THEN, after a little edumacation and contet, you can consider flamebaiting me.
But while stereotypes persist that programmers have no people skills, you forget that many business people don't either.
Just ask yourself: how many effective, people-oriented bosses have I ever had? If your answer is "not many", you're not alone.
I've been software engineering for over a decade. These are a few observations I'd like to share with managers:
--- "We've always been at war with Eastasia."
Managers prefer a different description. They like to say that software is created by software developers under a process that they control.
This is false.
But it makes managers, their pathetic plans, and their meaningless schedules seem more important.
This deception has a cost. It makes software development even more difficult that it already is. This is one of many advantages that open source development has over commercial software development.
sweet, we could have computers automate all kinds of functions for us. Hey we could even build that kind of intelligence into security systems to help us fight the terrorists... I think we should call it Skynet.
On the other hand, I kind of like filing cabinets.
Or maybe they just took into account the fact that accidents happen? Ask anyone in the insurance business how it works. Accidents happen at a predictable rate, you cannot predict one single accident, but you can predict how many accidents will happen in a large project during the years it takes to build a bridge.
Only to idiots, are orders laws.
-- Henning von Tresckow
Users make software development hard.
...ahhh, sleep - who needs it!
And Managers.
Users and Managers make software development hard.
And Vendors.
Users and Managers and Vendors make software development hard.
Other than that it is easy. I am actually able to read this article two weeks into a major implementation....
http://www.perfectreign.com/?q=node/42
The Kai's Semi-Updated Website Thingy
"I think one of the biggest problems in our industry is accountability."...that'll change overnight the first time some judge rules that software that is sold must have a normal consumer warranty attached to it. Every other consumer product out there has at least a legal implied warranty-software?
It's either treated like art, or engineering, if it is engineering and sold-it needs a warranty. If that stops new features for a few years all over the planet and forces serious code review and best practices changes and marketing descions changes-, than so be it,better now than later. The day that software got patents, it should have had warranties forced on it from the government.
I'm still waiting for some big business who gets hosed from the exploit dujour or some bug where it costs them serious folding money turning to their lawyers and going ENOUGH, sue the hell out of them and base it on lack of warranty, see what happens.
You are only going to avoid it for some time period, you aren't going to avoid it forever. It's only gonna take one rich well known and powerful company which isn't an IT company but relies on it to do this. And because of that, given the amount of total failures out there with software, and the amount of companies who aren't software companies..it's going to happen and that judge is going to rule in favor of the plaintiffs without any doubt.
Ya'all screwed the pooch insisting on patents. As long as it was just in the art class, copyrights, there's no case, but with patents? Ha! And you can threaten it's impossible and a web browser will cost one million dollars per copy and all sorts of dire things-and it won't matter. there are 6 billion folks and growing on the planet, they all want good paying and non-physically exhausting jobs if they can get them, and if some folks won't or can't do a job that still has a lot of demand-someone else *will do that job* and cash the check.
It's time the "get out of any responsibility, neener, neener" free EULA card got smashed to pieces. And it will happen.
Fred Brooks in his masterpiece The Mythical Man Month draws a distinction between an essential thing and an accidental thing. Something is essential if it can not be removed; accidental is the antonym.
Most people, when answering the question of why software development sucks, answer with a long list of accidental points. Most of them are true, and most of them are worth thinking about. But it's worth considering the essential reasons why software development is hard, too. I think the two biggest essential problems are:
- Our expectations rise more quickly than our capabilities. In many important ways software development is getting easier, but we always want more. Towards the end of last year, over a couple of months with no more than two full-time man-weeks devoted to the task, I squeezed out a weblog server platform. It has all the features you'd expect from a weblog platform in 2001, a healthy dollop of later features, and the beginnings of some unique features that are why I wanted a new platform in the first place. I did enough programming in 1997 to know what it would have taken to match the capabilities of this new weblog platform. Rather than two man-weeks, I'm probably looking at twenty man-years, what with the caching and SQL and other fun stuff I get nearly for free. It's easier for me because I got to build on one of the current trendy web frameworks, which itself builds on a lot of software that wasn't around ten years ago.
- Nobody wants to pay for good software. Given the choice of "Fast, cheap, correct", a choice that isn't going anywhere in the near future, people consistently choose fast and cheap. By "people", I mean everybody: Developers, customers, the accountants in charge, users, you name the group, that's their decision. I'm not prepared to say that's even the wrong choice, because of the magic of compound interest "fast and cheap" can be the most rational choice. But nevertheless, this makes it effectively impossible to have "correct" software, which is what people are really bemoaning when they complain about the state of software engineering.
This isn't by any means the whole story; we've still got a lot of accidental things in the way. But these essential problems guarantee that many of the complainers aren't going to get any happier anytime soon, because even if we completely fix all the accidental problems, these essential problems will still be enough to trigger further complaints.But no matter how our software advances, our expectations advance faster, so it seems like we aren't moving forward or are even moving backwards. We aren't. We aren't moving forward as quickly as I'd like and I think life for programmers is about to get very, very "interesting" in the Chinese-curse sense (multi-core is going to rock our world, and I think a lot of people may never really make the transition...), but we are making progress.
Many people say that all we have to do is apply the practices of other engineering disciplines to computer programming. This Slashdot discussion is no exception. But what these people fail to address is who is going to pay for these techniques, which uniformly involving doing "more" of something, usually a lot more, with more expensive people with more training and "more" of a lot of other things (training, personnel, time, testing, etc.).
Of all the Renaissance painters that ever painted, only a few became forever famous.
I think this might be taking the art side a little far.
With a painting, the surface appearance is the end product. If it looks good, it is good.
This is distinctly not the case with software. Not only does the application (or whatever) have to look good on casual inspection, but have to be built to work well, including under conditions that might not have been thought of in the beginning.
I think architecture as a metaphor for software development is actually pretty good; architects have to combine artistic judgment and technical skill in order to produce a building that's both aesthetically appealing -- true works of art, in some cases -- but also structurally sound, designed according to accepted standards and principles. It's not enough, in most cases, to just have either one. Nobody wants an ugly building (well, most people don't), and nobody wants a building that's just a facade without substance.
Software "architecture" is where house-building was a few hundred years ago. When you wanted a house built, you just went and got a few people that you thought would be good at building houses, or had good reputations for building them, and told them what you wanted. They might or might not have any formal training, and the only 'standards' were what they knew from past experience would probably work.
I suspect that in a century or two, software will be not unlike house-building is today. While every house today is different, depending on the owner's requirements, there are a set of well-understood and basically accepted standards for putting them together. That doesn't mean that some builders aren't better than others, or that some don't cut corners, or that there's not room for artistry and physical beauty in the final product, but just that in theory, they all meet minimum standards for structural integrity and other key factors. In time, I think software design will probably follow. Every piece of custom software will be different, because they each solve different problems, but getting to that solution will involve a combination of creativity and the application of existing standards, built up from the accepted body of knowledge of what works and what doesn't.
"Ladies and gentlemen, my killbot features Lotus Notes and a machine gun. It is the finest available."
Eh, I'm not even gonna say it. You saw the movie.
It's rare that you're presented with a knob whose only two positions are Make History and Flee Your Glorious Destiny.
Everyone keeps on with the bridge building metaphors as if software development/engineering is actually engineering. It isn't. We're not engineers. Software hasn't been around long enough to be engineering, it's barely a science and largely an art. That's the problem right there in a nutshell.
There are really a number of related issues, but when it comes down to it, it's not engineering. How much code will it take to do XYZ? I don't know. I can guess and give a rough estimate. How much cement and how much steel will it take to build bridge ABC? A good bridge engineer could tell you with a great deal of accuracy without building the bridge first.
Software Engineering is such a bad name for it. Knuth had it right in the early days: The Art of Computer Programming.
Oh wait everybody does do it now.....
.com boom resulted in all sorts of people becoming involved with software development who did not come through the traditional Academia, DOD and Fortune 500 DP departments avenues to IT and therefore did not learn formal software project best practices -particularly the ideas of QA, testing, signing off on approved, agreed to and frozen specs, and Acceptance testing/signoff.
and that's part of the problem.
-if we step back to the '90s the growth of the internet and increased usability of PC-based tools combined with the
Obviously some of the methodologies have changed and streamlined since the rise of the internet and I'm not dissing everyone who came into the industry through non-traditional routes, as I did, but there are a lot of people in the biz who are unaware of or unwilling to follow organized software project practices (or their corporate culture does not support these practices ie. the customer is always right, even when they're wrong, clueless non-technical managers, etc).
I also realize that the formal requirements of a Javascript applet on a webpage is going to be considerably less than those of an Fortune 50's payroll application. But it seems that there are too many people who are used to the Javascript-level of project formality who continue to work at that same ad hoc level even when working on something much more complicated and risky like the aforementioned patroll app which requires formal specs, schedule, acceptance criteria etc.
The resultant jumble today is that two identical projects at 2 similar companies will go completely different directions and potentially have completely different outcomes based on things like the personal prefernces or knowledge of the architect, or the lack of an architect and the whim of the Software Lead or Project Manager. Then the QA and Test departments and everyone else down the line will also have their unique take on what is needful and what they consider to be a priority and what is correct functionality.
This underscores the thing that I am wrestling with at my current company: Best Practices
Every company should have and follow them and the different softwware subcategories should also have them, but as with most good ideas, they are mostly honored in the breach as it takes extra effort and consensus to implement them.
On the other hand there is so much diversity in software development these days that there is definitely no 'one size fits all' Best Practices solution either.
-I'm just sayin'
No specs. That's what does it. Period. No design in the first place.
Its possible to iterate forward by making chunks that do parts, but in that case you need the customer to understand that. They usually don't.
Failing that you need specs. ANd the customers never have them.
I was just coming out of my experiences at Salon, where we built a content management system in 2000, which was painful. I was one of the people in charge of it, and when the dust cleared, I thought, I don't really know that much about software development.
.NET is not much better. Then there's the tools which typically require a whole bunch of error prone glue code that does nothing for the business problem but is required to use the APIs. Then there's sub-standard debugging tools that crash or slow down the system.
People in charge of decision making who don't know how to build software, don't understand what impact their decision has on the overall project, and don't allow counter-arguments to be made properly because they don't understand the problem in the first place is probably THE number one reason software projects are difficult and come out with less than ideal solutions. The poster should never have been in charge. He should have had competent technical staff who ALSO understand the business under him who he trusted and had authority to make decisions.
Other things include:
1) Poor industry standard libraries/APIs and tools that require the developer to think about work arounds and fulfilling requirements to successfully use the API/tool instead of focusing on the business problem. Just look at the mess that a J2EE project is with several different languages: Java, JSP, Jabascript, HTML, CSS and libraries: Hibernate, Struts, EJBs. By the way from what I've heard
2) Technology moves so quickly that developers and architects barely have time to learn one technology before another is thrust upon them and touted as an improvement that will solve all their previous problems (conveniently sweeping under the rug any new problems created because hey the peddler is out to sell their product to your team to use).
3) Specs that change significantly mid way through the project. Usually these changes don't just add something new but actually change the fundamental way the project worked. Oh and we need it yesterday. How many bridges do you know that need to be made 30% bigger mid way through the project, and not just by extending on? The business needs to plan what they want out of the software much better and try better to anticipate changes that may be required.
4) The developers are often good at coding and "talking to machines" not at talking to people. This seems to be steadily improving but its still true that a lot of developers don't have social skills. Often this leads to the test team and/or business becoming hostile or seeing them as "propeller heads". I've seen this get REALLY bad on one project to the point that the test and business staff were openly abusing the developers who didn't know how to take some stand. Developers can get frustrated or burnt out if treated badly regardless of their abilities or lack their of.
5) Changes to trivial look and feel elements when there are more critical flaws in the product. Yes I understand polish is important but you don't polish a half built car for fuck sake.
These posts express my own personal views, not those of my employer
> Why is conducting an orchestra so hard?
.... "Then I tried conducting an orchestra." (cut to Peter in front of an orchestra) "Should I-... Should I conduct with my penis?"
Peter Griffin:
Oddly enough, this is insightful if you think about egoless programming and egoless management.
Conducting an orchestra is a lot easier than conducting a software project precisely because in the orchestra, when is playing, people subordinate their egos to "the greater good of the music". In software projects, ego enters all over the place. Programmers want to work on pet projects. Managers want the appearance of progress more than they want actual progress. Users want to short cut the change control process to force their features in above what others want.
Wish somebody had told that to the first guy who coded ls.
/a:d in MS-DOS) and have gone through the ls man page. ls just doesn't do it.
I agree. I don't know how many times I've needed to get a list of just the subdirectories in a directory (like dir
When our name is on the back of your car, we're behind you all the way!
FTA:
The idea is that if we're going to turn the creation of software into a true science, we need to first have principles. We need to know the fundamentals and formulas by which software behaves. What are the laws and principles we can count on in creating it?
I think Knuth has been working on that.
But in general, the reason software is hard is that the problem domain is hard. You can't solve anything without understanding the problem. This is why hiring code monkeys causes so many problems. THey may make nice GUIs and know how to build a web based wizard 'out of the box', but end up knowing nothing about the problem at hand.
Other observations:
1) He gets it write when he talks about things always changing. Part of the reason projects like Vista get delayed is that they take so long is that the requirements change. If you can't do it in 6-9 months, don't do it.
2) Nice to see him reference Brooks.
3) Another nice qoute:
The only real reason that a team gets together and writes a new piece of software is that they want to do something new, something another product doesn't do, whether it's to add a feature, or to be compatible in a different way with another system.
For years now I have said: "Software development is R&D". If the software has been built then use it. If you must do scratch development, then understand that it will be open ended; and all attempts to schedule, budget and predict will fail. It is *not* an industrial process, though we tend to treat it as such.
4) My observation is that much of 'Software Development' is actually social. You are working with users, managers, investors and programmers and trying to get everyone to agree on something. It gets political *fast*. So a good SD team must not only bee good at learning new problems domains and coding up solutions, but also must be good at human relationsships. And the closer the development team is to the end user, the easier this is.
putting the 'B' in LGBTQ+
(and design changes and implementation changes) is not well enough understood as
a factor that makes code development expensive and in some cases infeasible.
Relative Kolmogorov Complexity is, roughly speaking, a quantitative measure of the
informational (descriptional) difference between a bitstring (e.g. program) A
and another bitstring (e.g. program) B.
What we really need to understand is the complexity of the difference in the expected
input to output patterns of a program, after someone specifies or makes a certain change
to the program.
Often, a requirements change that sounds to a layperson as very simple actually results
in a very large informaitonal complexity of the difference in the program and intermediate
data structures needed to achieve the change, compared to the previous program and data
structures.
Usually, programmers have some inkling of this complexity of change, and
managers/executives/customers do not.
For a software program to be well-architected and well designed means, among other
things, that it is explicitly designed (via appropriate patterns and abstractions)
to make many hypothetical future changes to the behaviour of the program be achievable
with low Relative Kolmogorov Complexity of the software change.
The program's form must also be constantly minded by a software architect so that it
retains this low-complexity adaptability property.
The opposite of this is known technically as a "hairball" codebase, and unfortunately
is what the overwhelming majority of programs turn into in very short order after
a small number of changes from the original conception (initial requirements understanding)
are implemented.
Formally, a hairball codebase has almost no changes in its external behaviour (appearance
or logic of the output or process) that can be made without an infeasibly high relative
Kolmogorov Complexity. The "hairball" program structure is encrusted with special-case "warts" that
lead to geometrically multiplying complexity of the program's logic, and consequent multiplying
complexity of changes to the program.
Oh I suppose it is important to mention that the relative Kolmogorov Complexity of a software
change will be highly correlated with the cost and likely bug introduction rate of that change.
Until this (admittedly very) theoretical notion is understood by the authority figures
(PHBs, managers, executives, and customers)
who make the executive decisions controlling the conduct of software projects, disaster will
almost always loom.
The PHBs and customers need to ACTUALLY LISTEN to the software architects who say we should
spend some time and money up front crafting a maintainable, adaptable program, and we should
spend some time and money throughout the lifetime of the program to keep it that way. The
architects, grokking as they do at least the essence of the "RKC of change" problem, are actually wisely
trying to SAVE money (and maximize the chances of project success, in the medium and long term)
but are usually incorrectly perceived as being geeks with "no sense of business" if they
are foolish enough to bring these issues up in meetings with PHBs.
As Ray Ozzie says, "complexity kills", and the "relative Kolmogorov complexity of software change"
theory (aka "hairball entanglement theory") should tell us exactly when, why, and how much.
Where are we going and why are we in a handbasket?
"I was one of the people in charge of it, and when the dust cleared, I thought, I don't really know that much about software development."
... naw, couldn't be.
Gee, what a surprise. A lot of people in charge of software development projects don't know much about software development. Do you think
art is about "saying" something through your craft which I don't think is really the goal of software development.
...Unless, of course, you are developing speech synthesis software. In that case saying something is the entire point of what you're crafting.
When our name is on the back of your car, we're behind you all the way!
The usual (imperfect) example of this class of problem is used cars. The seller knows the condition of the car. The buyer knows it's either OK or a lemon. The buyer doesn't know which, doesn't want to get burned, and therefore won't pay the price of an OK car. The seller doesn't want to sell OK cars at lemon prices. The market fills with lemons. Dealers in used cars get a bad reputation as a class.
Cars are a bad example because the buyer can pay $65 to a mechanic and get a pre-purchase inspection. Software buyers don't have that option. Imagine paying for an audit of the Firefox code base. If the software is closed source, then the pre-purchase inspection goes from prohibitively expensive to outright impossible.
So buyers can't force the suppliers to provide good software, because the buyer's don't know what it is. Especially since the people approving the purchases know even less about the software than the users do. Software suppliers can stay in business shipping junk like $YOURFAVORITEEXAMPLE. Suppliers who take time to do a good job go out of business competing with hack shops. It's not coincidence that some of the best software is non-commercial.
I've worked with various companies at the past and one of the main reasons why software projects fail is lack of attitude of people involved in the process. Even brightest analysts, developers, managers etc give up fighting over time, resources or trying to change the flow and in one point they say "yeah, whatever".
Then we have simple human problem - when they need to work as a group, they think that they've already failed (that manager is a dick, project will fail again. Yeah, whatever) and then we do not even try to improve situation, meaning - we have lost battle without even fight.
Of course, it is very difficult to manage humans, but at least execs could try hiring more HR pros, instead of counting money (which have not been earned yet).
Everyone talks about customer needs, satisfaction and motivation of talents that work in the company, but basically no one gives a shit for real, so maybe they are doom to fail and it is not such a bad thing anyway.
...that software development needs to have a team of programmers who are talented and competent, and a project leader who knows his people and can effectively lead and manage both the team and the project... and a corporate culture which doesn't treat its people distrustfully like a bunch of indentured servants, then they can write good software and get it done in reasonable amount of time. Getting and retaining a team of very good talented and experienced programmers is very difficult and expensive however since most development firms are cheapskates and not only do not pay enough, but treat their people like dirt, binding them under all kinds of bullshit NDA and non-compete contracts, poor work environment with noisy cubicles or "bullpen" office areas, not empowering them with latest technology workstations and tools, etc. The software development company that teats its programmers golden is the rare exception... the exact opposite "sweatshop" like I described above is generally the norm, as I've seen it in my 20+ years in the biz, hence you usually get kids right out of school as entry-level positions doing the bulk of the development. The best cream of the crop programmers have mostly all quit programming years ago and now are all sitting in management positions and programming no longer.
A good orchestra conductor who is in front of a bunch of rank beginner inexperienced musicians will not be able to make very good sounding music. You get what you pay for.
Joel on Software loves to remind us of this article whenever some company claims to have vaporware that will allow "anybody" to program computers:
s /NoSilverBullet.html
"No Silver Bullet: Essence and Accidents of Software Engineering"
by Frederick P. Brooks, Jr. (author of "The Mythical Man Month")
http://www-inst.eecs.berkeley.edu/~maratb/reading
"Computer", Vol. 20, No. 4 (April 1987) pp. 10-19.
Software development is hard for many reasons. I agree with earlier comments that a fundamental issue is that our ability to dream up software requirements easily exceeds our ability to build it. I recently wrote an article discussing how trying to meet the various functional and non-functional requirements makes producing good software so hard. Check it out: Producing Good Software is Hard.
The point I am making is that instead of making things more reliable and refactoring out useless complexity and "features", market dominators benefit from complexity which they use as a competitive weapon. They also leverage the profits of one product line/service to take over others. I have worked for 2 different large SW companies for many years that each were market leaders and yet were driven out of a product sector by a larger domination oriented software/system vendor who used this exact technique. I have lived it and witnessed the process. If it were funny, I would be laughing.
If the dominant commercial OS of today could provide half of the guarantees of antique OS's of the past, I would be happier. The reality is we have a poorly designed foundation on top of which software has to sit. The whole thing leads to a system and software that corrupts itself and crashes and is effectively designed to wear out. Imagine software that wears out, a perfect way to ensure future revenue and sales of new software.
If I hadn't written a complex vertical application that is still running all aspects of a complex medium size business without incident for over 20 years, I'd say that software cannot be reliable or just fully serve its purpose like an appliance for years without maintenance or improvement. But I know it can...
I have worked with Linus years ago and respect him and his goal, which I understand as just providing an alternative. Linux is, well basically unix, like BSD... It isn't something new nor is there any agenda to create a complete, yet fully functional "new" environment that has dramatically reduced complexity while offering new levels of power and capability (like Flash for example). Linux is good enough for a lot of people to do useful things with.
What bugs me most is that young people who might consider programming are not provided a welcoming environment that most can succeed in using for school projects. Use of the computer is limited to word processing and graphics. The 100$ Laptop is a multimedia book for 3rd world kids that I wonder about. How about kids in the USA? Lets see, they should use MS Dev Studio? or Logo... Laugh. How about smalltalk or a similar environment.
Software is being made to serve vendors need to sell something they know how to make, not to serve peoples need to understand, model and solve problems most effectively. Vendors make what is easy, not what is worthwhile. Exceptions to this are rare and usually expensive. (like Reason(tm) music synthesis for example)
Thanks for listening to my perspective. YMMV
SimBuddha
Pudge
Pudge's projects
Maybe it's you, who's arrogant.
What makes software development so difficult is:
* Capturing accurate requirements from users. Users are rarely able to articulate what they want in IT terms, so you need a translator... and things are occasionally lost in the translation, or the user says "well, that's not too important..."
* Development takes time. Lots of time. Beta tests, regression tests, etc... Even before it's in production (and I won't even go near the getting it in production part right now). As an iterative process - programmers are used to writing, tweeking, writing, tweeking, writing, tweeking until it's just right...
The problem is that a USER has to be involved in some of the tweeking and testing, and they get burned out on the whole process rather quickly... they tune out...
* While the developement is happening - the business continues to run and evolve and *shit happens* which means requirements change to deal with the shit... This has a ripple effect on other development processes... and that requires more testing, etc...
* Because requirements change on the fly - things take longer than expected. When they take longer, they cost more. When they cost more - there's a meeting. And we all know how worthless 99.9% of meetings are...
The way you manage it is by taking things in chunks... Plan out the chunks on a GANTT chart - give everyone a timeline. Then if there's a change - you can plug 'er into the GANTT chart and look at the effects on the timeline and let the (l)users decide if they want to accept that or not...
Set milestones - make a big deal about getting to the milestones... Keeps everyone in the loop on what's happening with the project...
Lock the requirements in stone - (see change above) unless it's a "gotta have". If it's a nice to have, it waits until the next release. Gotta have = gotta have lots of signatures, all the way on up to the people PAYING for the development... if they gotta have it, they gotta pay for it. If they don't wanna pay for what they gotta have, they can't have it. It's that simple.
Oh yeah - caffeine... anything the programmers want with caffeine - no problem. Get them food. Get them caffeine. Get them training... Treat them right - they do right by you too... they're nuts and fight with nerfs and frisbees in the aisles, but they'll get it worked out...
-- whatever the user wants to key in
Output requirements:
-- the answer they needed
OK, the rest is for you guys to figure out. See you tomorrow.
Faster! Faster! Faster would be better!
From Yourdon to Xtreme, every few years comes along another fad diet purportedly designed to "fix" the "software development problem." In fact, these things are really designed to sell books.
Managers, under pressure to make things better and who don't have any idea how, naturally gravitate to these fad diets and reorganize their departments to attempt to conform and gain the advantage these diets promise. This will often have the effect of making the problem worse, pissing off developers, adding additional constraints that impede development by attempting to pigeonhole their round-peg developers into the square-holes of the "perfect" software organizational structure.
The problem is, just like food diets, there does not exist a one-size-fits-all solution to the problem. However, that does not deter the interest and saleability of a one-size-fits-all solution, even one that does not actually work as advertised-- and an author can always explain away the failures by an "incorrect" application of the solution for one reason or another.
There's at least one factor though, that must be in place in a succesful project, at least according to the manager's definition of "successful" which is usually more related to "on time" than "feature complete"-- the developers must produce, manage and own their own schedules. A developer working to a schedule externally imposed will feel too little responsibility to meet it, while a developer working to their own schedule will be personally invested in it enough to feel the need to work harder when necessary to retain their own credibility.
A far better motivator is, "you said it would take you three weeks," than, "if you don't get it done in three weeks your fired," or even, "if you get it done in three weeks you'll get a bonus." While the second approach may seem to work in the short run, it will often have the side effect of increasing turnover via the reduction of morale when the imposed schedules are unrealistic (as they often are). And the third approach may do the same, depending on the effects the pressures have on the developer and to what extent money outweighs them. But the first approach involves a developer's own integrity in the motivation, who only has themself to blame if the schedule was overly optimistic.
Be cautious however, of attempting to convice a developer that he can do it faster than their initial estimate by suggesting that some optimistic scenarios are likely. Quite the contrary, a good manager should insure that the more junior developer has considered some possible unforseen events, in order to assist the less-experienced developer in developing realistic schedules for himself. And a cautious manager will actually add additional padding to a developer's schedule to make up for the unforseen that even the experienced developer may not have considered, further enhancing the likelyhood that the ultimate target release will be met. I know some managers for example, that will routinely take a developer's schedule and multiply it by 2-- and I can say it makes it a great place to work with little turnover-- developers feel that there is usually enough time available to do a good job, are invested in the process and proud of the (often) quality results.
Writing software today is in some ways comparable to sword making in about 800AD. Lots of people want to do it, some actually know how and fewer still know the right way. Doing wrong can get people (and projects) killed, but still there are a lot of folks doing it that just barely know how.
Things didn't really get better until the whole process was "industralized", probably closer to 1400AD.
Software development beyond just mathematical processes is only perhaps 50 years old. Software development as any real sort of "engineering" is maybe 20 years old, if that. Call back in 100 years and maybe, just maybe, there will be as much progress as there was between 800AD and 1400AD in sword making.
Herding cats is hard because you are using the wrong management technique. You herd cattle (and sheep and goats and pigs etc.), you do *not* herd cats. Cats, you put them in the general area of the mice and let them do what they are good at. Micromanagement of cats is a losing proposition.
putting the 'B' in LGBTQ+
Especially #5 and #6, so true. I'd add one more correlary to #1:
(8) Developers that don't understand business. Just like the MBAs can be arrogant bastards with unrealistic expectations, you also have developers that might be very talented coders, but at the same time egotistical fools that completely disregard the needs of the customer. Joel Spolsky does a very good job at documenting that type.
- mediocre developers that think they are architects/computer scientists
- design by commitee
- vague accountability structures
I think there is some truth to this along with renaming, repackaging, reselling, and retraining (of past capability) to keep cash flowing into the future. Example: Lotus123 (and the shareware knockoff AsEasyAs) were faster, more accurate and capable of doing more sophisticated computations (e.g. multiple regression analysis) than Excel. The GUI revolution had much to do with it. Same with email. At 1200 baud in character mode, they flew by faster than I could read them. Now, with a popular provider's latest beta version with Flash, it can take as much as a minute per just to delete them unread! Coupled with simple but very useful programming languages back then, it was too empowering. Users would become totally independent of MIS and big vendors. And now there are so many non-productive distractions that rank and file employees need to be heavily monitored at their workstations. Another need to be filled! How this scenario ever got sold to upper management is quite a mystery to me.
Obviously learn the basics of programming, then read Code Complete, you will quickly realise that this book is a revelation in coding terms, not just coding design, i'm not sure if it's worth reading Code Complete until you have a reasonable level of coding knowledge, then follow the suggested reading on pages 860-863, and a few others at the ends of the chapters, eg: Object oriented design heuristics by Arthur J. Riel, which i'm reading atm and looks good so far. Above all just keep reading, gl:)
I'm a rabbit startled by the headlights of life
Maybe fifteen years or so ago, the "software crisis" was still a much-talked-about topic. Today, with the situation as bad or worse, it isn't such a hot topic - we're used to it.
Or, according the Wikipedia, it was at least partially addressed by the implementation of various processes and methodologies http://en.wikipedia.org/wiki/Software_crisis.
If you've ever had to deal with the magnitude of overhead introduced by many of these "solutions", you know what bull-hockey that is.
There was a study in Communications of the ACM several years ago (sorry, can't find the reference) about user interfaces. In the course of the study, the experimenters had people use interfaces that were deliberately poorly designed. They didn't get a single comment on how difficult it was to use this software - people have gotten used to crappy, clumsy software.
Software development is now incredibly *EASY*. I mean we have tools such as C#, VB, .Net, Java, Perl, PHP, Python, COM, CORBA, SQL, J2EE, IIS, APACHE, XML, XSLT, HTML, XHTML, SOAP, XML-RPC, JBOSS, ZOPE, CSS, AJAX, Javascript, XQuery, XPath, UML, Patterns, SCRUMM, WMF, CardSpace, Passport, Windows, Linux, OS-X, WME, Direct-X, OpenGL, SDL, Eclipse, SVG....I mean, all this stuff software development still cant be "hard" now can it?
...it has already been thrashed out with the same old comments.
Waste of time to re-hash the same-old same-old.
BWilde
The BUSINESS of software is hard. if i had design specific's that never changed mid project, managers who let me do my work and didn't make other worldly promises to clients, if coders were actually apprechiated and this nonsense idea that coding is an unskilled job went away.... then software developement would be a great job and we'd have great software. unfortunately business does all it can to ruin software for itself. they demand speed over quality then wonder why they get shit?
If you mod me down, I will become more powerful than you can imagine....
This has a name. It is called the Peter Principle.
DNA is a Turing machine. You, however, being dynamic and emergent, are not.
That is a very good analogy, and I would add that it is very common for city official to expect and intentionally ad 'hacky' solutions to city planning.
Barbie says it's all the math involved.
What Makes Software Development So Hard?
Asked and answered in 1987, and still spot-on. No Silver Bullet: Essence and Accidents of Software Engineering
See also: The Iceberg Secret, Revealed.
I've been thinking about this for a while, and my answer will probably rustle a few feathers will all the developers in the crowd. I know I don't like the answer since I am a developer as well, but I believe it is correct.
The simple fact is that too much of the software development is left to the peons, ie. the developers. The skillset of the developers are totally random, as is the style, their expertise, etc. It introduces too much variability to the software development process.
Look at civil engineering projects. They are able to create buildings, bridges, roads, etc, and for the most part are much better understood than software development projects. But the peons, ie. the construction workers, do not dictate anything. There is one way of bolting steel together, one way of mixing concrete, etc. The only person who has any say is the chief architect.
However, in software, a lot of the design decisions are left to the developer.
In order to introduce predictability to the software development cycle, unfortunately, all variability must be removed. Developers must not have the freedom to code whichever way they want to, but have a simple, standardized way of accomplishing similar tasks throughout the codebase. This completely removes creativity and enhances predictability and leave all creatvity to the chief architect for the project.
Obviously, I don't like this answer because it's the creativity portion of programing that I enjoy the most, but I think it is for the most part correct. With the people I work with, their skill levels vary from good to horrible. Software development requires a certain level of skill sets that most people don't have and too many people who shouldn't be coders are coders. These are the people that introduce bugs, etc.
The Mythical Man Month tells us a lot about large scale projects. Written decades ago, it still holds true today.
Some key points:
+ Large scale projects that require a large resource pool will lose a significant % of man hours due to communication overhead
+ Adding resources to projects will cause the project to slow down before it will speed up
Sure, a lot of business people have no people skills.
;)
But since we're all about talking truth here, let's not forget to mention that a lot of software engineers don't have programming skills either.
I'd say loudmouthed egos outnumber talent in both camps.
But you know, that's all good! Because if everyone were as smart and talented as we wish they were, then we would be the dumb ones that everyone is complaining about!
"So, if well tell Cyc that Duke is a Dog, it can conclude that Duke has a tail and eats food. If we tell it that Duke lives in Paris, it knows that Duke lives in France."
//duke is a doga ris']); //who lives in Paris //yum.
$duke = new Dog('Terrier');
$duke->setHome($earth->country['France']->city['P
$duke->eat('Alpo');
Yay for OOP.
Besides, how would Cyc know you meant Paris, France and not Paris, Tennessee? Or Paris, Missouri? Or Paris, Illinois? The ambiguity inherent in natural language is probably one of the biggest reasons we're not programming in Plain English.
The Worse is Better design philosophy, idiocy, selfishness and greed are factors leading to the difficulty of software design.
Large software projects, books, PhD thesis ...
Even if you know how to do every single part, it is hard to manage consistency because of the sheer size.
What you're missing is that an ontology system like cyc has hundreds of thousands of such assertions, and has reasoning capabilities of basic abstract concepts such as 'things', 'temporal things', 'spatial things', 'intangible', etc.
;)
Check out this diagram. Cyc has 1.4 million assertions. How long will it take you to finish your program? How long to troubleshoot?
Cyc has a language for making assertions. It has no ambiguity. In my example of the IM interface, cyc could determine ambiguity and ask clarifying questions.
Computers are useless. They can only give you answers.
-- Pablo Picasso
Lack of Rigor. But then, it's not appropriate to compare a bridge to a piece of code in 90-99% of the applications. Bridges HAVE to work every time - hard to reboot a bridge. Software, on the other hand, can be rebooted at need.
... tend to work way better than, say, word processors? I think people put the necessary effort into software creation, and for essentially everything we use, that's not much.
Notice that fuel injection units, pacemakers, fly-by-wire systems,
I think that the time has come for "programmers" to become workers. You want a new system for managing telephone calls? Let the programmer have a day of training and some OTJ experience answering calls using the old systems. There really is no substitute for first hand knowledge. It's probably also time for the death of the general "programmer" in favor the the more specialized niche programmer, everybody specializes in one type of software or another.
People who think they know everything really piss off those of us that actually do.
One of the better reads on this topic:
t im.html
http://www.idiom.com/~zilla/Work/Softestim/softes
Here's my view, based on my own life experiences as a one time software developer. Software development is partially an art form. No matter how well studied people are, writing awesome software requires passion and having some qualities that are like being an artisan. Just an artisan with great vision can turn a piece of stone into "David" it takes analagously speaking, similar qualities in creating a system of code that are resilient to change but at the same time extensible yet with maintainable.
The reality is, for many people, software development becomes a means to pay bills, nothing more. Which is fine, many people do this. However unlike the task of perhaps excavating a 10 foot by 100 trench for construction purposes, software is littered with intangibles including bad specs, unmotivated software developers, new paradigms (AJAX), etc., etc.
At least if you're working a construction crew, things are much clearer and you as a foreman can insist on people "stepping up" if needed. These measurements are simply not possible with software. Despite all the panaceas that has been given labels over the years, hard numbers just are not possible. And if you at least concoct a metric system that seems to work, you might have staff that quits and at that point, all those metrics are gone. All developers are *not* created equal. Fact.
There was a day when I used to follow the ANSI committee on C++ and knew the language incredibly well. I wrote some of my best code ten years ago including C++ frameworks that others had occasions to rely on. Sadly, I did *not* observe this attention to detail with my peers save for a couple of them. I had occasion to observe a couple of developers once wanting to rewrite my code since they had never used the Standard Template Library (STL) and had never encountered keywords such as "mutable" or my use of the "new" C++ (at the time) cast notation. Never mind that the code worked and did what it was supposed to and a peer review of this code (two seasoned and driven C++ developers) did not recommend changes.
The greatest "sin" I observed during my years of software development were individuals who programmed by rote, i.e. cut and past programming and simply did not have the motivation, inclination or passion(?) to learn the very programming language that constituted their "bread and butter." Expecting a largely unread person to suddenly write like Shakespeare (or columinist at a major newspaper) doesn't just magically happen. The most articulate people of the English language are always well read. They've at some level "paid their dues" engaging your mental faculties that many people never bother with. And just like with many things in life, practice, practice, practice.
Things perhaps have gotten better in the software development realm if only because there are less platforms to worry about now. By and large everyone is creating web applications and if you are not, then you are probably serving some vertical market (I doubt you are creating a WinAmp competitor) or work at large companies - Microsoft, Apple, IBM, Cisco, etc. Writing a Cocoa application (Mac OS X) means coding in Objective C but how many of you can make the claim you code in it regularly? Point made.
As my career advanced and I worked with web developers I saw many people not at all inclined to pick up new material. The one thing that web developers were incredibly bad at is induction - taking two principles or abstractions and creating a third. Most of them seemed to learn one way of doing things and applying this by rote over and over - cut and paste programming at its worst.
And since web apps are par for the course at many institutions now... well you can imagine the results.
-M
Software Development is about solving problems given a limited amount of resources and time. And as with any "project", software or not, things get harder to manage as they get larger.
t h
Go read Mythical Man Month by Frederick P Brooks
http://en.wikipedia.org/wiki/The_Mythical_Man-Mon
I think part of the problem is training. Too often programmers are taught "How to use a computer to do X" (and often " ... in language Y") instead of "How to do X". The focus is on the tool(s). If we taught carpentry similarly, and the Saw was the primary tool, the training would be "How do cut siding with a Saw", "Building Frameworks with a saw", "driving nails with a saw", "Roofing with saws!", etc.
Computer science seems to focus on the computer. Engineering more often focuses on problem solving and/or design, with a emphasis on the type of engineering the department specializes in. I think it would be interesting to see if there's a difference in projects where the primary degree is Computer Engineering vs Computer Science vs Electrical Engineering. Also, many of CompSci departments seem to have cut way back on math and other subjects that focus on abstract thinking. I don't want to condemn all CompSci departments of course, but having taught and helped in curriculum development in Comp Sci, I'm not completely blowing smoke here -- one has to put up a fight to keep broader courses in the curriculum
However, even if that's completely off base, and I'll allow it could be, there's also the fact that people tend to severly underestimate the difficulty of designing a system. We'll happily decide to do something in software we'd never consider doing in hardware. Why? Does the system design get easier when the construction material is completely insubstantial and there's essentially no intermediate level at which parts of the design can be simulated or tested? If a system is to be implemented in electronics, there's a lot of science that can be applied at various levels (differential equations, boolean algebra, component simulators, etc). If it's going to be in software, we don't need that, the programmer can do it all in her head!
We know hardware design is difficult. For some reason, we think software design is easy.
(I'm sorry, perhaps I'd best take my medication...)
Because programmers refuse to design, and designers refuse to program.
If only we'd just work together...
Have you read my journal today?
always making promises to consumers that cannot possibly be kept. Always making promises to developers that cannot be kept. Running a negative work environment and heaping stress on the developers in hopes that they will work harder and faster and also calling them names and yelling at them does not help but only makes things a lot worse instead.
Compare this to the F/OSS development that doesn't have Classical Managers screwing things up, etc. Is it any wonder that most F/OSS projects are better than the closed ones?
Remember, Slashdot does not have a -1 disagree moderation, and no, troll, flamebait, and overrated are not substitutes.
... here's one more:
In every complex activity, there are limits to the envelope formed by the boundaries of complexity, time available, and changes per unit time. Like juggling 3, then 6, then 21, then 317 bowling pins while ice dancing to reggae.
What makes software so difficult is that the profit motive drives people to operate on the other side of that envelope. That, and managers are too fscking stoopid to understand that those boundaries exist, preferring those time-honored management techniques of allowing customers to massage the design long after construction is well under way, and throwing bodies at the resulting late project.
It's not so difficult to understand.
Like doing advanced math with roman numerals (no translation).
But then the hindu-arabic decimal system came along with its (how can nothing have value) zero place holder and the common man was able to do more than replace the roman numeral elite accountants, they were able to do more math.
The same thing applies to software development, a need for an easier way.
hence, Abstraction Physics.
http://threeseas.net/abstraction_physics.html
any one (of the elite) wanna help?
Engineering is the application of materials sciences.
The problem with your theory is that it's wrong in its premise, because:
"Engineering is the design, analysis, and/or construction of works for practical purposes.".
I'm an engineer, and Wikipedia's definition is perfectly correct. For instance, many important areas of engineering deal in energy, which is not a material and is not studied in materials sciences.
"Why is conducting an orchestra so hard?"
The real problem is the tools and lack of maturity in building "atoms" or building blocks of software code. This is the real fundamental problem that and many programmers are divorced from. Then there is the serious hardcore mathematics and actually DEFINING the hell the problem... is and it's solution, no one takes the necessary time to coalesce the raw data, refine it, and make conclusions from it. Everyone's in a bloody rush.
Next is time constraints, time constraints are a REAL problem in my opinion. You can't plan for what you don't know about or what you can't even begin to define and measure, especially when it has cascading effects through an enormous system know one can truly understand fully. This is why MEASUREMENT is so critical in the software industry, there should be whole sections of industry working together and DEDICATED to analyzing the scope of different problems and how large systems can get so they can better estimate whether their chasing fantasies or not.
The next is serial vs parallel programming, many programs still run in a serial manner and we have yet to really wrap our minds around how a computer works (running algorithms) and building algorithms that can actually make easy to use parts of programs, to build bigger 'machines' (programs).
All programming is is an exercise in engineering mathematical 'components' called software. The fact is much software development is 'on the fly' engineering. There should be a serious industry dedicated to just making the basic 'parts' of programs, and testing these parts by actually making programs with them.
Many programming languages do not cut it in the slightest... the fact that there are so many different languages tells you a lot about the fundamentals of computer science: That even the fundamental tools are still not there yet to build robust software.
In my opinion feature drift is the biggest problem. CRUD (edit/search/report) screens would be almost a commodity science if it was not for all the added tweaks that people want. Saying "no" is not good politics, but necessary if you don't want to make a mess. I don't want to say "no" myself; It is a career slapper.
Another problem is poor designers who don't know when to seek help. I've seen cases where every combination of factors was turned into a different trend-monitoring screen. They tried to "meta-tize" it once so that the combinations were table-driven or dictionary-driven, but the programmer they tried couldn't handle meta programming (dispite being otherwise good at regular programming). Thus, they abandoned meta techniques and hand-wrote every combination to meet a looming deadline. You need meta experts for meta work. Instead they paid 10 programmers 8 months of work to produce each combo. (I was one of those, but my lobbying for a meta technique was rejected because meta-ing failed once before I got there.)
Table-ized A.I.
Nah, bring in the right management team, and the problem is solved. The only reason the number 45,872nd seller on Amazon isn't number 1 is because the author wasn't being managed by an experienced team of managers familiar with Unified Authorship Model and Extreme Storytelling. Oh, and the right marketing team could have made it fly off the shelf. And what were they thinking writing this thing in English? Everybody knows it's too easy to make mistakes in English. Esperanto would have fixed that. I think the guy was lazy too. If they had barged into his garret and asked him for status reports every half hour, the book wouldn't have missed the deadline by six months. What a shame.
For all intensive purposes, "whom" is no longer a word. That begs the question, "who cares"?
The bigger the program, the more interplay of potentially-failing factors: more variables, more method calls, more potentially insufficiently-tested classes/libs/components pulled-in, more likelihood of multithreading (raising the probability of the problems that come w/ that, e.g. race conditions, deadlocks, etc.), more likelihood of networking functionality (which of course depends critically on the reliability of other systems), etc. etc..
Calculating the risk of failure in software is one giant conditional probability problem, in which each very small piece (say, storing a 4-byte value as an integer in memory) may have been coded and tested ruthlessly for decades. But the software those operations form are, in every case, brand-new within the user's domain, [1] else, it would likely be purchased instead; the more code is being executed, the more opportunities there are for failure...
So say you write an app and you know it has 2 major failure points, A and B. P(successful_execution | !A and !B) = 1 - (P(A) + P(B)). But now add a third failure point, C. P(successful_execution | !A and !B and !C) = 1 - (P(A) + P(B) + P(C)). The probability of a successful execution can do no better than remain at the same level with each additional failure point -- that is, with each additional line of code (or class, or module, or however you choose to measure and define potential failure points).
In short, as complexity rises, so do the number of potential failure points, and thus the probability of failure. And because most projects are from-scratch -- even if they've been written before for another organization, the developers won't have perfect memory of that solution -- they are all-new creations, each time, assuring that those failure points have not been ironed-out before (again, minus whatever those developers manage to remember at their new job)...
[1] You may have written an awesome logging function for a megacorp once, but jumping over to a startup, they won't have it, so you'll have to write it again (unless the previous company open-sourced it, but that's highly unlikely).
Is Capitalism Good for the Poor?
The 2x4 is 1-1/2"x3-1/2"+/-.
Current programs seems to be exclusively a digital re-creation of paper-based forms and filing cabinets. It's a sheet of paper with a bunch of field:value pairs, and reports are the resulting logical operations you can do with all of that data. This is *basically* the relational database. I think we are hitting the limit of the field:value model of reality. I think there are other models, such as virtual realities like online worlds, knowledge systems like opencyc, etc.
I disagree. Relational databases can represent just about anything any other logic system can, including Cyc. I do agree that RDBMS vendors sometimes put in limitations or difficultes to gain performance, but that is an implementation issue, not a problem with relational theory itself. I've seen Expert Systems written in dBASE that did what $900 AI ES's could do. (dBASE was only partially relational, I should note.)
The biggest problem with tried AI is that the users don't understand it. Yes, it *can* be powerful, but it is too abstract and "odd" for most users such that programmers are needed anyhow to translate biz rules into machinable stuff, and all the usual problems of programmer-versus-user interaction/translation comes right back just as before.
There still is no Golden Hammer or Silver Bullet.
Table-ized A.I.
Yay for OOP.
You don't need OOP for that. Plus, we want the *users* to put the rules in, not Java programmers. And, OO is lousy with many-to-many relationships. It turns into a big gob of object references (pointers) like a modern-day Go-To filled program. Similar messes in the mid 60's are what motivated Dr. Codd to invent relational.
Table-ized A.I.
Looking at the ratio of "insightful" vs. "funny" postings here... it's obviously because programmers just don't have a very good sense of humor!
Why doesn't anyone ask why Brain Surgery is hard? Why doesn't anyone ask why writing good music is hard? Why doesn't anyone ask why starting a successful business is hard? Why doesn't anyone ask why designing an effective sales campaign is hard? Software development is hard because it's complicated, just like all of the above. It takes dedication, time, and, most of all, a lot of intelligence. Software development frustrates the business community because they want it to be manual labor. In manual labor, employees have no value because they can be replaced by anyone at any time. With skilled labor (such as software development), it isn't that easy. The standard for companies is to offer lower pay and attract worse engineers, which yields worse and worse code. In recent years, we've seen companies looking for lower-cost countries, hoping that would save them. It turns out that there was a huge shortage of good engineers in those countries, too! Throwing more people at the problem doesn't help. Companies need to hire better people, and to get better people, they need to pay them more. Your product managers should not be making 2-3 times as much as your engineers. If that's the case, you're going to have shitty engineers, and shitty products, too. You wouldn't trust your child's life with an unproven, unskilled, low-cost surgeon, why would you trust your business' life to an unproven, unskilled, low-cost engineer? Stupid, stupid, stupid.
Instead of:
if (x == 0)
try the following:
if (0 == x)
This way if you do:
if (0 = x)
you will get an error.
LedgerSMB: Open source Accounting/ERP
So there really is such a thing as a software engineer.
do foolish process and management
while abort retry fail >>>
There is no god; get over it already! Never exchange a walk on part in the war, for a lead role in a cage.
In a badly run company, nobody even asks developers which is the best approach. Imagine if civil engineering were like this...
Well, I do live in Indianapolis...
I think one of the core problems that makes developing software hard these days are the limitations of the programming languages we used, more specifically their limitation to express *what* one wants to do instead of *how* to do it. Simple example: If I want to read a file in C I have to fopen() the file, fread() my bytes out of it and finally fclose() the handle, maybe even dynamically allocate the buffer with malloc() and stuff. By writing that I however don't express what I want, but instead I express exactly how it should be done.
...} to have an interface that works with both gzread and fread, this however only works so long till I have to interact with some for foreign code that has its own IOStuff structure, it does the same as mine, but again, a little bit different and 100% incompatible, the whole wrappering starts all over again. A few days down the road and I am stuck with wrappers stacked on wrappers, that do pretty *nothing* beside working around limitations of the language. And that happens a lot in programming.
As soon as I want to do the same thing differently, say read a compressed file via zlib, it all becomes a mess, since now I am stuck with a munch of different read/open/close function that look pretty much the same as the ones before, but are all incompatible. Next step now is to abstract it via something like struct IOStuff{ ReadFuncPtr read; OpenFuncPtr open;
The solution to this would be a language that gets much closer to what I want to do and much less into how I want it to be done. In Haskel for example I can just write 'readFile "foobar.txt"', there is no opening, no closing and most important the file is *not* read in completly as it would be in your average scripting language (Python, Ruby, etc.), instead the reading of the file is delayed till you actually start to access the returned string.
Now I am not saying that Haskel is the solution, but functional languages seem to get a lot closer to allowing to specify the 'what' instead of the 'how' then imperative languages.
Another important aspect is that such a language to be practical needed to allow one to specify the 'how' as well, thus allowing manual optimizations in the places where they are needed, many how the higher level languages so far fail to do that.
Todays programming is just to much based on duct-taping to work smooth and easily and I am not sure that will ever change until we kind of restart from scratch.
But while stereotypes persist that programmers have no people skills, you forget that many business people don't either.
My observation is that the "suits" have better people skills than the techies. However, they often stop using them, especially around techies. Thus, techies don't know how to be nice; suits choose not to be nice. The flip side is that techies tend to be more honest with you. Suits enjoy tricking people.
Table-ized A.I.
Anyone can write a book. But, writing a book that's *GOOD* and that people will want to read is an entirely different matter. Computer software is no different.
It was a dark and stormy framework. However, I found secret hooks in the dingy rusty corners of the internet that would allow me to bypass the ugly leathery underbelly of this belching framework beast. My ex-girlfriend told me where to find the hooks in exchange for a little favor. Well, she's not really my ex. You see, on my last C# contract, I found a bug in the compiler and both her and I spent all night trying to...
Table-ized A.I.
Communicating a nascent idea is hard enough, but most aren't taught (and few learn) how to efficiently plan their project. Things get haphazard, and code soon becomes dense and unmanageable, as the team attempts to meet deadlines without spending the time to develop solid structure.
The sad part is that we look at this like an engineering problem. For people doing business related software, it really isn't. Mostly, we are trying to formalize a process that has "guidelines" and "best practices", but no true hard rules. There is no laws of physics in the business world. Obviously, there are some rules (e.g. accounting), but nothing that governs the whole process.
So, every piece of business software becomes an exercise in politics. We all hate politics. The mindset required to really like politics tends not to be prevalent in people who like programming. Politics are imprecise and have wiggle room that doesn't translate well into software.
The second part to this is that we are a young profession. Not even a hundred years of programming. We are craftsman, not engineers despite some people's job titles.
You are wrong: "programming" isn't hard, what is "hard" is finding that unique algorithm that will precisely solve the problem on hand, once you have that, implementing becomes a breeze.
It all boils down to a search for algorithms.
Read up on the following to get an idea of why the "hardness" really exists: Rice's Theorem, the Halting Problem, the Totality problem
time time everywhere and not a second to spare
why the rocky culture of software development continues to exist despite all of the missed deadlines, blown budgets, and broken promises.
You must be new to this world. In my world, every project that builds some non-trivial thing misses deadlines, blows budgets, and breaks promises. See also: Government, Engineering, and Construction.
Example: I just moved into a townhouse that I put a down payment on roughly 18 months ago. I was given at least 4 deadlines by which they were supposed to be finished. Each one blew by with a mighty whooshing sound. The price I paid miraculously did not go up.
Example: The Government of British Columbia built a fleet of fast catamaran ferries about 5 years ago. Except that they weren't fast, they weren't reliable, and they were astoundingly over budget. They were eventually sold for pennies on the dollar.
"No problem. I have the capacity to do infinite work so long as you don't mind that my quality approaches zero."-Dilbert
Pick one:
a) cheap
b) fast
c) good
Software design is just like building bridges ...
... but it needs to have a swimming pool in it. And an airport. You must be able to take off or cross over, depending on whether the vehicle is green or non-green. Except on Tuesdays, because on Tuesdays we actually need a boat ramp, not a bridge. But the swimming pool stays. But only the diving end.
"I want a bridge from A to B
We'll let you know how wide it will have to be halfway through construction. Well, actually, we are not sure that we really need to cross over that body of water. We might just be using the bridge as a car park. Our staff always need to have somewhere to park. Well, half the time. But Accounts would like to use part of the bridge to store their old end-of year reconciliations. Perhaps we could use those to prop up one end of the bridge, to save costs and materials."
Users often don't know what they want. Don't know what their own processes are. And often lack any vision about how to change them. Getting the user to be clear about what they need, and to sign off, is hard. And meanwhile they think you are the one that is holding up the project, because they have no idea how useless their "specifications" are. And you have to be nice to them. Patience is a programmer's virtue, if they are dealing directly with the client (our programmers do).
I am anarch of all I survey.
It is hard because there are people still raising this question.
Software development is not hard at all. Writing a hello world program is very simple.
The hard part is to meet client satisfaction, given the intangible nature of software.
Requirements in business system change quickly too.
What you are describing is a domain specific language for the entire world. It would be the work of generations to construct such a language - a language that correctly modeled the human intuition about how the world works. How do we model gravity, friction, refraction, fluid dynamics, etc, etc to such a degree of fidelity that we can use that model to do work? We don't. We can't. This is the kind of wonky pipe-dream that infests the management levels of businesses and the ivory towers of academia. It's a great example of why software development is hard - people like you think you understand the problem, and convince people in power to do stupid things.
You, sir, are no software developer.
Computers *are* simple logical machines. We must render down complex human needs into "simple logic puzzles" because that is all computers do. That's it. At its heart, every computer made is a simple logic machine. EVERYTHING ends up ground down into the same fine paste of boolean logic and simple math. That is the tool, full stop.
This is just another variation in the strong AI pipe-dream. "Generally accept[ed] accounting principles"? What a laugh! Even in domains as staid and static as accounting, there are thousands of nuances to every decision. When and how to file expenses. How to categorize items. Which depreciation method to use, given dozens of unique conditions, to maximize tax benefits. Do you really think we can come up with a system that gets these choices right 99.999% of the time? Basically, you're waving your hands, and saying "given the proper libraries and world simulation software, development is easy." You're missing the point that developing those items would be a dozen orders of magnitude harder than just writing the software the way we do it today, with your much derided "logic puzzles".
Looking for a Rails developer in Chapel Hill?
Actually IMO he and tons of people have got it wrong and that's why Software Dev is hard and software still sucks.
;) ).
This is because most people don't understand the big difference between making software and say making a skyscraper (or bridge or airplane).
1) With software, the _prototype_ _BLUEPRINT_ actually compiles and runs and is usually sold as is (version 1.0
2) Too many people keep thinking that the programming part is like the _construction_ phase of a skyscraper, and that it should be planned and managed that way.
But they are WRONG, programming is more like the _DESIGN_ phase of a skyscraper: coming up with drafts then a detailed design, the the final blueprint where the position of every significant item is fixed.
The actual construction phase of the skyscraper is more like a _compile_ of the final version of the source code - the part where you go "make all".
Blueprint = source code. Skyscraper in use = executable being run.
3) The other important difference with software is:
The design cost of a software project is much more than the compiling cost.
The design cost of a skyscraper project is usually far less than the construction cost.
The owners of skyscraper projects are usually willing to spend a fair bit more on the design if _necessary_. No problem spending a million more to make sure the skyscraper "just works" - because it's still a fraction of the cost of building a new skyscraper.
But for the owners of software projects _each_ design and redesign adds significantly to the cost of the project (in time and money), and it doesn't matter whether it's the prototype, or the "final" version you are designing. Redesign = project costs 2 x more.
Constructing one thousand copies of the same "skyscraper" is trivial and cheap in software but not for civil engineering.
Designing one thousand _different_ "skyscrapers" is not trivial or cheap in software or in civil engineering.
And the advantage of designing skyscrapers is it is easier to _realize_ and explain to the bosses that they are asking you to break the laws of physics - "sorry you can't fit an extra 3 elevators there, this is how much space one takes, this is how much space there is".
Seems to me that most "Management", "Software Engineering" and "Project Management" people[1] don't understand these differences, or don't want to accept these differences.
And that's why most software sucks and will continue to suck.
[1] A project management trainer once asked a class I was in for example suggestions on how to speed up the building phase of a software project - he said for a civil eng project you'd add more machinery and people e.g. bulldozers, construction workers etc. So I suggested that the equivalent was more and faster CPUs, and he didn't like that.
I doubt the civil engineering bunch will keep adding fresh grads to speed up the design phase of a new building.
In 20 yrs, Software will build Software. Humans will longer be required to code, test, and deploy. We will have software build software - and humans will just input the specs. No c#, no Java, no dev platforms, no operating system issues.
Believe me, its only a question of few years. Writing code will be as extinct as punching cards.
Really it's not that hard.... Exclusively use global variables, people, global variables! Software practically writes itself at that point.
Also, don't let other departments steel your interfaces. You wrote them, damnit, and they're your secrets!
On a more serious note, I'm more interested in who knows how to make it easy. From my experience, writing non-trivial software is an inherently difficult process, but perhaps there is something nobody is telling me...
Likewise, with software development (and really most computer systems development), everyone wants to rush out and start coding as fast as possible...but if they'd made sure there were no assumptions, defined their problem specifically, and spent way more time than they wanted to developing an architecture, the coding afterwards would just be data entry for the most part.
I think for many interesting problems, this is effectively impossible. That's because the future environment into which your software must fit is, for many projects, unknowable. Even if you really could collect every current available fact and carefully work out every logical implication, that wouldn't be enough because there are teams of other people just as smart as you working hard to beat you any way they can.
In the end, I've just accepted that requirements will change all the time. Every week our team says, "Given everything that we have figured out so far, what's the most useful thing to build this week?"
To you I'm sure that sounds crazy, but let me add that I agree with your next points: everything should be tested, we should invest vigorously in good architecture, in highly reusable code, and the product should be kept spotless and taut, like a well-run sailing ship. I think the only place we differ is in that you'd like to put most of that effort up front, while I'd like to do it continously.
At least for my environment, that seems more sustainable. Instead of fighting people for time up front, I start coding as soon as they feel like they can name one week of work that they're sure will be useful. But when they ask me to hack something together, to cut corners that we'll clean up in that mythical land called "later", that's when I fight them tooth and nail. Every week I give them some features they want built the best way I know how.
The reason software development is so hard simple. How many software projects have you worked on that were more or less exactly the same as the last one? Probably none. If you ever do work on a new project that is exactly the same as the last one it's usually the easiest thing in the world. Because you know EXACTLY what to expect and what's needed to make sure it all works. The very nature of IT projects is that your always doing new projects that have never been done before. Why write software that already exists? On top of this your working with a tool set that's constantly changing. Every 3 - 5 yrs programming languages change so much you might as well start from scratch. Since I started working in development I have used Progress, VB 3-6, .NET 1.1/2, ASP, ASP.NET 2 etc... All significantly different, which means your not really building on your knowledge. So a developer with 10 yrs experience does'nt neccessarily know more than one with 3 yrs experience in term of using the tools to do the job.
If the same situation applied to real world engineering, hammers, nails, drills would be completey different every 5 yrs and every house built would be totally different in shape, materials etc.. than the last one built. In fact if you ever watch a documentary on buildings where radical designs are used, you'll find they have more or less the same problems software projects have. The buildings are never on time, they might have to restart half way through. The new tool they bought which hasnt been tested properly doesnt do the job etc.. The same problems as software projects have.
In short, software development by its very nature does not build upon it's previous expriences. To gain competitive advantage IT has to be an ever changing process, in terms of tools used and technology implemented. Therefore IT development is a science but not an exact one and IT engineering is virtually non existent because engineering is about consistency, something IT will never have.
about software development i've ever saw was (and still is!) an almost 30 years old comic? poster, see http://people.bath.ac.uk/ccsjst/gifs/swing.jpg/, or google images for 'What the user wanted' to see other versions.
What's in a sig?
Software engineering is not any more difficult than other engineering disciplines. What makes software "hard" is that 1) Engineering methods are not rigorously used 2) Not enough people review the work of coders during the SDL My .02 cents!
Horns are really just a broken halo.
> Perhaps if people died when software was not right like it does with bridges, things might change.
http://en.wikipedia.org/wiki/Therac-25
"I thought, I don't really know that much about software development."
Thats right Dorothy, you and Toto aren't in Kansas anymore. There's this evil thing called
software engineering ( sometimes referred to by prominent freedom coders as "the wicked witch" ).
Is there a correlation between the level of formal software engineering education and the belief that software
should be free ?
I think I agree with the underlying ideas of what you're saying, but I disagree with the comments about amateurs.
I don't play in an orchestra, but I do have a lot of experience in the world of dance. The current world champions in the style I dance turned professional recently, after winning the world amateur championships. In their first competition as professionals, I think they came fourth, i.e., although they were training as amateurs, they were comparable to the fourth best couple in the world by professional standards. Clearly this is the peak of achievement, something most of us can only aspire to, but the same pattern is repeated at lesser levels as well, with people reaching the top ranks of amateur competition in their country, turning pro, and almost immediately establishing a high ranking in pro competitions as well.
Perhaps more telling is that when organising events for my local club and looking for a couple to do a show, we've often found that top amateur couples give a more entertaining performance than some of the pros. Technically, they're not always quite as sharp (though this is by no means certain either way), but the passion and performance are all there, while sometimes it feels like a pro couple are just going through the motions. I've always put this down to the fact that the amateurs are doing it for love, not money. Every show is still a special occasion to them and not just earning enough cash to pay the rent, and they take pride in their performance and enjoy entertaining people for its own sake.
That love-or-money distinction applies to a great many fields, IME, and software is no exception. As numerous freeware, shareware, and open source apps have demonstrated over the years, amateur developers can be every bit as good as professionals, if they work effectively and (very importantly in this case) they collaborate well. IME, it's usually the latter that lets down larger-scale amateur software compared to professional stuff written by teams who are all working in the same place with professional management co-ordinating them.
If you disagree, post your argument. (-1, Overrated) isn't your personal censorship tool for views you don't like.
Actually, we're almost completely in agreement. Even if you rebaseline your understanding of the project (and what's important to build first) weekly (Ive done it daily for some things), you're still planning before you code and making sure you completely understand your requirements before you code. The two go (as you rightly point out) hand in hand.
The only thing that I think really needs to be done up front that is much much harder to change in the middle of the project is the basic operating architecture of your project. In many cases, that's going to be the messaging bus and other similar components. Hell, most (??? my experience, don't know if that's fact) complex projects don't even have a robust messaging/services layer architected in at all. If you do that right up front, it makes making changes, adding new features, and scaling the project much easier down the road.
If you don't have that at all, your project will be much more painful.
One day, you might be able to just sit down and talk with an ontological system via email or IM, and say, "We got a check from client A for $575, another check for $440." and then the computer balances the books with all the other accounting principles it 'knows'.
We'd better test this well, to keep our customers and the IRS happy.
Maybe we can check its results against some formalized rules. I wonder if we can automate that somehow? We could call it our "test program", or "program" for short ...
The powers that be never seem to want to know or pay the true cost of software projects. If more initial go/no-go decisions were based on reality there would be fewer project failures.
Ignoring problems won't make them go away. At some point you have to deal with memory management, either manually, as in plain C, or automatically, as in Java. It's not a waste of time solving 'computer' problems, because if you do not solve them, your program won't work. How do you think your ontological system will manage memory - by magic?
Currently with computers we are trying to abstract problems such as banking and business into simple logic puzzles. I think that's too much of a simplification. I think we need to create a virtual world full of basic human-percieved concepts, such as time, weather, humans, animals, etc. and create programs by manipulating those basic ideas and objects.Easier said than done. Researchers have been experimenting with strong AI for decades, and have yet to produce any system that can operate in the same way you describe. Sure, you can string together simple logical concepts, but that's not how people think (apart from programmers). Natural language is littered with complex inferences, and designed to be processed by a great number of parallel analogue processors. Computers in 2006 lack the processing power, memory and architecture to operate an effective general interface with such a system.
having to deal with too many overwrought tools with too many extensions and partially compatible layers of overly extended somewhat coherent but not entirely consistent object collections attempting to isolate functionality and succeeding in broadcasting vulnerabilities and erratic performance.
He's wrong.
- The structure of the human organization pretty much prefigures the structure of the code.
- The longer you code, the bigger it gets. Predict code size by looking at coders multiplied by months. After you're past startup numbers.
- Communication is n-squared difficult.
- Higher level languages produce higher level results.
- Teams that work together on a project will work together better when and if the same team is used on the next project.
- If you build what the customer says they want, you may be building the wrong thing.
There's more, some of it undiscovered....and the answer is Microsoft, who "improwes" existing standards to be incompatible with the rest of the industry.
Another reason may be the whole sw-patent business...
Haven't heard this acronym before...
You can....
1) Apply middling investments to compromised specifications with weak analysis, high turnover and poor deployment planning and pay a bucketload of money in the backend well in excess of any money you "saved" and STILL have a failure-in-place.
2) Do the job right, which will cost so much that everyone will realize that, gee, computing as we know it is actually quite expensive and you don't get that much of an ROI on large, complex, all-encompassing systems, especially after you count the fact it takes years to do a project right and the target moves.
How about
3a) Design a lightweight standard for software designed internally. Don't get caught up with the process becomming the deliverable. Do it in a month.
3b) Work on small, light, throw-awayable modules that do specific tactical functions and connect to each other through the lightweight framework in (3b). Never spend more than 6 months on a project. Don't be afraid to abandon projects that aren't working out because there's no point in feeding a dead horse.
3c) Engage engage engage the user population so they understand that IT is a craft, that it deserves respect, and that you're trying to help them.
The problem always comes down to how many orders of magnitude a given project is larger than human-scale. If you get beyond something that, say, 7 people can understand, you're screwed.
I consider compilers and interpreters harmful. Programmers write a line of code and test it to see if it works without understanding what happens inside the computer. This "write - observe - fix" cycle gets repeated many times until the most visible bugs are fixed, but nothing guarantees that the system does not contains hard-to-detect bugs deep internally. We need more software engineers, but most people who use this title in companies are either normal programmers or systems analysts, or project managers. When was the last time you used non-deterministic finite state automata, Z notation, or even basic flowcharts at your company? Never used such methods? That's why your software sucks and you need a year to write simple applications that could be written in a month if you used a proper methodology and good methods.
"Ignoring problems won't make them go away. At some point you have to deal with memory management, either manually, as in plain C, or automatically, as in Java. It's not a waste of time solving 'computer' problems, because if you do not solve them, your program won't work. How do you think your ontological system will manage memory - by magic?"
How does Java's or Python's garbage collection work -- magic? No, what happened was that people solved the problem once already, in a re-useable way, so that we don't have keep solving them every time we write a program. The idea is to make progress, to make things easier. If you're writing an accounting program, you should be worrying about accounting problems, not memory management. Or do you think all programs should be written in assembly?
I'm not saying that Java's memory management has reached Nirvana and there aren't any more improvements to be made. I'm just saying that not every programmer should be working on it, especially when you're trying to solve other problems. Sure, memory issues will show up in any programming project you undertake, but that doesn't mean that every program should be optimized to that level, or that every programmer should be able to work at that level.
It's like saying a figure animator at Pixar needs to know how to push memory around in a stack, and that will help him when he is animating a running lion on a computer. No, it won't. We make higher-level programming tools so he doesn't *have* to worry about registers and stacks. Tha animator needs to study physiology and anatomy to be a better animator on a computer, not boolean logic.
He doesn't need to learn about auto-repair to help him drive to work in the morning. If his car has trouble, call AAA and let him spend his valuable time learning to be a better artist. We have a complex, diversified society so that we can have experts that push the boundaries and advance our culture, whether it is in computer science or animation.
Like I said, there will always be a place for low-level programming, boolean logic, OS development, etc. But I think we think of programming too often as computer science, rather than as a way to create tools to allow people to solve problems in other areas of life. The perspective we seem to use is "How can we translate problems from other areas into computer science problems" rather than "How can we make programs that are more helpful in solving other people's problems?" Introducing an accountant to memory management is *not* progress.
Basically all I'm saying is that for most programming jobs, we are still working at too low of a level. We seem to think that real programmers need to work at the memory-manipulating level, and if you're not doing that, you're not doing real programming. Well, not every smart, talented person working in programming needs to be doing memory management.
Computers are useless. They can only give you answers.
-- Pablo Picasso
For instance, contrast assembly to a language like Java. You can create a dynamically sized list of numbers easily in Java, whilst doing the same thing in assembly would be a lot of work. On the other hand, the problems that a Java programmer has to deal with are usually more complex than those an assembly programmer would need to face, and Java is also a relatively more complex language. It seems to me as if programming won't get any easier in future; the problems will just get harder.
Furthermore, just because a language is higher level, doesn't make it easier to understand or comprehend. Compare these two code snippets:
In Java: In Haskell: Whilst Haskell is clearly the more powerful and expressive language, it also relies on concepts that aren't immediately obvious. It seems to me that there's no guarantee that programming in the future will be any simpler than it is now.
The point which can be made as far as software is concerned is that the higher the level of abstraction the greater the productivity the person is capable of producing. A programmer in a language like Cobol is going to be two to three times as productive as one in assembly language. A software designer using a system like, say, Ruby on Rails might be able to do ten times as much work as someone writing an application using, say, C or C++, presuming the target task is the same. I am using this as an example, I do not know if something like Ruby on Rails actually can give a full order of magnitude increase in productivity. But I wouldn't be surprised.
The only problem is that if you take abstraction to its ultimate conclusion, you get a language like APL which, except for some niche applications, failed dismally because it became too difficult to work with. But you could do some amazing things with it. The "big thing" in APL was to write a "one liner," an attempt to write a complete working application in one line of code. And I have seen some unbelievable stuff done with it. Things that conceivably might take dozens or hundreds of lines of code in a lesser programming language really could be done in *one line* of APL. I've seen it done. It kind of convinced me I'd never be able to do that kind of work, I don't have the background.
But to have that kind of capability requires a really powerful programming language, and/or excellent subroutine libraries to support it. As well as good people to write code using that language. It is often said of APL that it is a "write only" language in that some people would develop cute tricks but if you ever had to do maintenance it would be simpler and easier to start over.
But if you are even just competent in APL, the level of abstraction of the language is so high that your productivity will easily be at least an order of magnitude - maybe even two orders - higher than someone of the same capability working in any other programming language. And a real "superstar" could do things that might not even be possible even in a considerably longer period of time in anything else.
Our minds determine the tools we have. And the tools we have, which basically consist, as I have stated, of not-very-good code editors, poor programming languages, and inadequate run-time support, don't make it surprising that we have such problems in the development of software. But people are thinking about ways of improving it.
There is a guy named Louis Savain who has been doing some work from time-to-time on his idea: the creation of software modules using the concept of a hardware abstraction, limiting the number of interactions and cross-actions by limiting how side effects can occur. He was of the opinion that he had a great system for reducing error, increasing productivity and reliability of software. I pointed out to him that what he has is an *idea*. Unless and until he actually has something implemented all he has is a promise which may be useful but is at this time unproven.
Basically he wants to create for software what the transistor and the printed circuit did for
The lessons of history teach us - if they teach us anything - that nobody learns the lessons that history teaches us.
Software eng is hard because it's right up there with Political Science and night soil carrier in that there is not real theoretical basis, no established codes of conduct or construction, no transferable teachable skills and so on.
Software Engrs as defined today should be banned from writing anything other than compilers and operating systems. Especially they should NOT be allowed to build any application whatsoever. Applications should be mandatorily developed by specially trained users of the application domain itself.
Anonimass
Software development is not hard. There is really just a single technique you have to learn, and it predates software development with a few millennia. It is divide and conquer.
When you have a large problem, divide it into smaller problems that can be dealt with separately. All the other techniques and tools (OOP, structured programming, extreme programming, top-down, bottom-up, rapid prototyping, waterfall model, etc) are just specializations of this. It sounds like you quickly got bogged down by the details of programming languages and tools, happens a lot to younger programmers. Just remember that these details are just details, and not the real issue.
The only slightly tricky part in software development is how to divide the problem so that each subproblem can studied in isolation, or at least with a minimum of information about the other subproblems.
I've known conductors who did all the work in rehearsal, and in performance did just enough to keep people together. I've known conductors who have to work really really hard in performance to keep inexperienced and unskilled people doing roughly the right things at the right time. I've known inspirational conductors who can bring out meaning in a piece that was never there before, just from subtle changes in stress and timing. I've known conductors who can completely change the mood and style of a piece to match the flow of the programme or the mood of an audience.
Of course, it very much depends upon how well the performers know the music, how well they perform, and how well they know the conductor -- and of course, how much attention they're paying to him or her!
In performance, some conductors concentrate on low-level issues: exact timing, articulation, pitch. Some think more about overall balance, texture, and mood. Some think mainly about the melody, and mostly leave the rest to take care of itself.
And no one of these is right or wrong. It depends so much on the performers, the music, the occasion, and the conductor's own interests and preferences.
Conducting styles vary, too. Even when simply beating time, some conductors put the beat at the end of the downstroke, or halfway through, or during the following upstroke. (Some conductors don't beat strict time at all, just wave their arms in their own time to give a vague idea of when to speed up or slow down.) Some add expression to their beating time; others use the other hand or even both hands for that. And so on.
As to orchestras ignoring the conductor, I've heard tales of orchestras who decide after a rehearsal or two that the conductor is useless, and so the performance is secretly conducted by the lead violinist!
(Relating this all back to software project management is left as an exercise for the player^H^H^H^H^H^Hreader.)
Ceterum censeo subscriptionem esse delendam.
Building a complex application from scratch is little different than building a mansion using no COTS parts.
I know a contractor who's favorite line is, "yep, that'd be about a thousand bucks".
"Can you just move the stairs six inches to the left"?
"Yep, that'd be about a thousand bucks."
See?, works great!
Many software developers tend to say, "OK, I can have that for you by 5", because their estimates tend to be the first point in time with a non-zero probability of being true. So, time management is another recurring issue in this circle, and inevitably intertwined.
"Can you move this button over here and make it blue?"
"Yep, that'd be about a thousand bucks."
Feels better, no?
My God, it's Full of Source!
OUTSIDE_IP=$(dig +short my.ip @outsideip.net)