After the Gold Rush : Creating a True Profession of Software Engineering
Background
I've always been amazed that certain fields of endeavor exist in which many people prefer rank amateurs to trained professionals. I don't know many people who would choose their neighbor's kid to perform surgery, or hire a journalist to build a bridge, yet every day software development shops hire people whose only training is that they have read some book on Visual Basic or C++ or Perl, and put them to work on major projects. In fact, in the software development business, experience can sometimes be a liability (see the debate over immigrant programmers and age discrimination). Don't worry, you won't have to apply for a license to write code, and no one is going to confiscate your keyboard if you design your own web page. Accountability, however, is another story....
What's the book about? Steve McConnell, author of Code Complete , Software Project Survival Guide , and many other excellent books on software engineering, has returned. For those of you who might not be familiar with him, Steve is President and Chief Software Engineer of Construx Software, a software consulting firm based outside of Seattle. He's also the Editor in Chief of IEEE Software, and is generally regarded as one of today's best authorities on how to do software the right way. In After the Gold Rush, Steve gives his view of where the software world should go from here.Currently, people don't know how to build software. Or, to be more accurate, there are good techniques out there to build software, but most people ignore them for one or more reasons, none of which hold up under close scrutiny. In addition, software development depends on death-march-style schedules, whereby programmers wreck themselves trying to get the software out the door at the appointed time. One major problem is that the developers are not trained in writing software in the first place. They are either trained in computer science, or some totally unrelated field. To compound this problem, very few if any continue their education in such areas as professional reading or training.
There is hope, however! Now that software development is moving out of its "gold rush" period, where the firstest gets the mostest, we can begin to develop software engineering as a profession. This means training people in engineering instead of science, and defining what it means to be a software engineer. Unfortunately, we have a lot of work to do both on the level of education, and in the mindset of today's software developers.
The third and final part of ATGR dwells on the future, especially as it relates to what these developments will mean for software developers of today. I'll spare you some of the suspense, and tell you that you won't be forced to be certified. Does anyone really care if your desktop clock was written by a true engineer? On the other hand, you bet I care that my air traffic control software and my medical scanning software and my car's control software were signed off on by someone who knows what he's doing. Licensing will be in software engineering what it is in other engineering fields: required in some areas, meaningless in others. In the end, however, software will be better for it.
What's Good?Personally, I greatly enjoyed this book, mostly because it says what I've felt for some time now. The development of true software engineering will be akin to the development of true medicine. We will be able to move ourselves from the Age of Leeches to a more enlightened age where quality and process matter. McConnell makes a compelling case for why events will transpire in this way, and what the benefits are. No one thinks that these developments will be some sort of panacea or silver bullet, but when true software engineers, complete with a code of ethics and a professional organization, are responsible for developing software, there will exist an undercurrent of ownership and responsibility that currently does not exist.
What's Bad?There's not much I didn't like about this book. If you develop software for a living, read this book. It describes where your industry is going in the next twenty years.
So What's In It For Me?Maybe a lot, maybe nothing. If you develop your software purely as a hobby, these events won't directly effect you much. You will never need a license just to write code. If, however, you belong to that cadre of programmers that likes to think of themselves as "software engineers," or who would like to think of themselves as such, read this. You won't be forced to take a test tomorrow, but software development will never be the same.
Pick this up book up at ThinkGeek.
- Table of Contents
- Acknowledgments
- Introduction
- The Tar Pit
- Software Dinosaurs
- Fool's Gold
- Orphans Preferred
- Software Engineering Is Not Computer Science
- Prospecting
- After the Gold Rush
- Engineering a Profession
- Ptolemaic Reasoning
- Body of Knowledge
- Novum Organum
- Through the Pillars
- Stinking Badges
- Architects and Carpenters
- Hard Knocks
- The Professional's Code
- Alchemy
- The Tar Pit
- Epilogue
- Notes
- Index
"The worst problem I see today with the software-creation process is design. Programmers design software (I design software, and I am a programmer). However, the people who are writing code for software should not be allowed to design that same software"
I don't know about that. However, I do get a lot of peer review and help along the way (as well as 1001 new client demands to sort out).
Seems to me that the pressures of 'first to market' are getting worse, not better. The marketing message is "Who cares how buggy it is, as long as it's available now?"
Interface design should be handled by a team separate from Programming. In this situation, the design is never built around code-logic, and therefore does not present the user with an interface based on the logic of the code. An interface should have logic of its own.
This is not to say that a programmer can't handle design as well as coding (certainly it's been handled gracefully before), but just that as a good guideline they should not. Moreover, I'll stick to my original statement: The worst problem I see today with software is design.
-----------
"You can't shake the Devil's hand and say you're only kidding."
The problems with software engineering are fundamentally a management problem. It's been many years since the "Mythical Man Month" showed us how adding programmers to a project can only make it later because of communications overhead. But, many many managers are still doing just that. Furthermore, many managers are afraid of the technology, proclaiming loudly that they don't know anything at all about programming computers; good managers can manage anything at all without knowing about it.
Gantt charts and org charts are something that programmers should never see. But yet in many companies I work with, you can't get anything done unless you've got a big graph of the organization to help you find someone who is high enough to have some weight, but low enough to actually have some brains.
And even worse, technologies are often driven by management needs. Software costs too much, so all the managers want to get some of that good object orientated stuff on the project. So, they hire a few C++ programmers out of school and give them Visio. The programmers are told that their highest goal is re-use. Never mind that the system they are building is meant to handle 320 contradictory/arbitrary business rules for selling widgets to a client in New Zeeland. So, the programmers dutifully build the system to be as re-usable as possible. And, those 320 business rules never get used anywhere else but New Zealand. Meanwhile, the primary goal of re-use has caused the maintainability of the system to go to hell, because management ignored the faster/cheaper/better trichotomy and gave the team a week and half to design the system.
I could go on and on and on about management horror stories. Every place I've ever worked has been the same way, and a lot of those places were Fortune 500 companies. Books outlining ideal software development worlds are great. We really need some new ideas in that area. But how much progress can we make if our managers have never READ the books?
If tits were wings it'd be flying around.
The art of programming has come a long way since its modern inception. Advances have largely come in stages: the advance from hardwiring to machine language, from machine language to assembler; from assembler to low-level compiled languages; and from low-level compiled language to high-level compiled (native and virtual-machine) languages.
The question now becomes: what next? What obstacles exist to the advancing of the art?
In my opinion, one of the main obstacles is the widespread use of C and C++. Both are low-level languages designed for close interaction with the hardware. (C++ may share features with high-level languages but is too tied to C to actually be an HLL.) This is a useful design for many tasks, but not for general application programming, at least at this time. Moving to safer, more powerful languages (Smalltalk, Dylan, Eiffel, Ada, ML, and Haskell to name a few with useful free implementations) is necessary, IMHO, to further the creation and maintainability of complex software systems. C still has its place of course -- critical inner loops will probably be implemented in many applications where the high-level language does not perform adequately -- but general development should move along to more useful tools.
I believe that the free-software community is uniquely prepared to do this, simply because language choice is a technical and not political problem.
Happy hacking.
Currently, people don't know how to build software. Or, to be more accurate, there are good techniques out there to build software, but most people ignore them for one or more reasons, none of which hold up under close scrutiny.
Yes unfortunately most people who program have learnt to program well before they come into any contact with actually being part of a team writing a large application. When it's just you sitting in your room at home coding something just for the sheer hell of it your style of coding and the method you use to design and implement the code are relatively unimportant. I'm sure the most popular method is the 1) Think of something you want to code, and 2) Sit there and start coding it as soon as possible :) Unfortunately this doesn't, in my experiance, work at all well for larger projects.
The software house I currently work for has a lot of problems with how the project is managed. The man in charge of the overall development for our application is far more interesting in trying to code things which have caught his fancy at the time than in making the product consistant, efficient or even bug-free. Designs have generally been of the "here's what we want - go do it" kind, and once someone has done a particular client, they're the only person who knows exactly how it works. When people leave someone else needs to spend a good two weeks just trying to figure out the code. We've recently started to move into a more structured approach to coding, but it remains to be seen whether this will have any impact.
Now that software development is moving out of its "gold rush" period, where the firstest gets the mostest, we can begin to develop software engineering as a profession. This means training people in engineering instead of science, and defining what it means to be a software engineer. Unfortunately, we have a lot of work to do both on the level of education, and in the mindset of today's software developers.
Very true - we've got a lot of good programmers, it's just that they don't know how to write a large piece of software. This is something I see a lot of, and it seems that it takes not just good programmers, but also a good structure for them to work in, to produce something that is consistant, efficient and can be easily maintained. For people out there involved in the same sort of work ask yourselves - if everyone involved in your project left at once, how long would it take for a new team to pick up where you left off?
It's an illusion to think that design and implementation can be separated. Software development is an iterative process rather than a linear process (req->des->impl->test->deploy). Separating design and implementation therefore is a bad idea because the design would get outdated rather quickly (and since time is money most companies wouldn't bother updating them).
In the case of OSS you'd have complete anarchy where the design people would simply be ignored if the programming people would disagree.
Rather I'm in favor of having an integrated approach such as in TogetherJ where design level changes are reflected in the code and vice versa. When working in a project you typically let the more experienced design people work on the designlevel while the programmers fill in the details. Since changes in design affect implementation and vice versa both coders and designers are forced to think about each others work. This leads to interesting things as a coder discovering design flaws and communicating with designers to solve the problem Similarly designers learn about implementation issues for their beautiful design since what they do directly affects the code.
"The worst problem I see today with software is design."
Well I think the problem really is lack of design. Often coders are ahead of the design team after a while. I.e. the design team is strugling to capture the current implementation rather than designing the next version. This leads to interesting stuff like "the source is the documentation".
Jilles
I have a degree in CS, 10 years professional experience, and I think this is misguided. Try as hard as you like, software just isn't like other "professions". Of course experience counts, but trying to become like other professions with certificates and other bullshit is the worst thing we could do. Professional bodies exist to monopolise fields of study and provide a bar to entry. Organisations like the American medical association and the Bar council are just protection rackets. There only purpose is to raise the salaries of those in the club, not "protect the consumer". We should irradicate them, not copy them.
Writing great software has more in common with writing poetry than law, medicine or even civil engineering. You can stuff huge organisations with "professionals" following "best practice engineering" and they'll still get trampled into the dust by a couple of smart kids working in a garage somewhere. I'm not saying you should hire any old moron to write software, but the trick is to have clueful (developer) managers and they can make up their own mind as to who to hire. Organisations *should* have the right to hire the neighbourhood children to write software, just like they have the right to go bankcrupt.
If you want to see something sensible on programming check out the programmers stone at http://www.melloworld.com/reciprocality
http://rareformnewmedia.com/
A person who writes a 20-line C++ program is a programmer (they have written a program; the very act of doing so defines them as one). It does not, however, make them a *good* programmer. Sure, if you happen to be practically perfect in every way then you don't to split up the work into different teams. If you're perfect, you can write an entire operating system by yourself. You can leap tall buildings in a single bound and stare down charging llamas.
I don't know about you, but I'm not perfect. I don't write all my code in assembly either. I write it in C++ because I find it easier to break my work up into protected objects. Along the same lines, I don't always trust myself to design the very best interface for my software. I'd rather get it right then be right.
-----------
"You can't shake the Devil's hand and say you're only kidding."
I've found that even if you have no idea what you're doing, it's still quite easy to get a job somewhere. You can bluff your way through six months or a year an then bail and no one will question the short employment times because they're so common in this industry. The company goes out and hires another programmer and if they get lucky they find one who knows what he's doing and that programmer takes a look at the previous programmer's code, realizes that person was an idiot, and has to start the project from scratch. I've been that second programmer a number of times now.
Compounding this problem are managers and recruiters whose expectations are often very unreasonable. They'll give you three to five programmers' worth of work and set impossible deadlines or they'll plunk you down in a completely unfamilar environment because you happened to mention that you looked sideways at the environment 10 years ago.
Further compounding this problem is the fact that when you get into the "Real World" you find that they're still doing DOS and are lagging a decade behind the OSS community and educational institutions in coding practises and hardware. Several times I've wanted to completely rip out the environment we were working in and replace it with a nice clean Linux system and of course I didn't have the authority to do so.
Lately I've decided that the first company to abandon all this crap will win, so I decided to hit the management track and carve out a small empire to demonstrate this. It'll be interesting to see if I can pull it off...
I'm trying to teach myself to set people on fire with my mind... Is it hot in here?
Engineering is making things that don't break any more often than you expected to, or more often than the budget allowed you to.
I know dozens of programmers (who are great coders by the way) who wouldn't know a good interface from a poke in the eye. And I'm not necessarily talking about aesthetics either. I'm talking about serious *interface* issues such as navigation and control. Being a programmer does not make someone a designer. The reverse is true as well, although it helps to intimately know who you are working with.
-----------
"You can't shake the Devil's hand and say you're only kidding."
Is that really true about experts? Can people with industry experience vouch for that as a widespread phenomenon?
I am a student, not an industry worker, but at my department (Rice University) the idea that you must abstract and reuse code as much as possible is drilled into our heads pretty unrelentingly, and is taught both in an object-oriented framework (via [increasingly] Java and [decreasingly] C++) and a functional programming framework (via Scheme and perhaps a smidgen of ML or Haskell depending on what you take and when), just so we'll be sure to get the point that the principles of abstraction aren't language-specific. I honestly can't imagine anyone who did well in our department going out to industry and writing code that didn't have a lot of code reuse built in.
Is Rice just an exceptional school?
-jacob
>However, the people who are writing code for software should not be allowed to design that same software.
/. types: openness and shared ownership. Yes, even if the product is proprietary, these things work wonders. The problem you're worried about occurs not because the same person does both design and implementation, but because they're allowed to do either in a bubble, isolated from other opinions and views and influences. If both the design and the implementation are laid out for other people to see and comment on, and if those other people feel that they "own" any potential bugs in the code as much as the primary author, those potential bugs will be prevented from becoming real bugs. There's nothing worse than a programmer who never lets on what they're up to, and nothing better than a programmer who realizes that leading other people through the process is even better than excluding them.
I strongly disagree, for the same reasons others have. They've done a fine job explaining the problem(s) already, so I won't duplicate their efforts. Instead, I'd like to suggest what I think is a better solution than what you propose.
Here are a couple of ideas that should warm the hearts of
Slashdot - News for Herds. Stuff that Splatters.
-----------
"You can't shake the Devil's hand and say you're only kidding."
The one important flaw to note about this book is that it treats software engineering as if the lone example of its practice is in the offices of commercial, shrinkwrapped software vendors. It may surprise a lot of people to realize that the total software sales of commercial software products (including all of Microsoft's products, Oracle's, and SAP's) are only a small, small percentage of the amount paid for custom software solutions for industry, government, and the military.
In these non-commercial arenas, strong software engineering disciplines have been the norm for decades. Good design, long development cycles, and carefully engineered software are an absolute requirement when human lives are involved (air traffic control, avionics, flight control systems, manned space flight applications, command and control systems) or extremely expensive hardware is affected (factory production lines, communication satellites, telephone systems, railroads, etc.)
To lump all software developers under the umbrella of the frenzied exercise that passes for software "engineering" in the commercial marketplace is a myopic view at best and is pretty much wrong. Yes, commercial software developers could do a better job. But market pressures don't allow for this, and frankly, they never will. So ranting about making the engineers do things "better" without addressing the market pressures is a waste of effort.
Until the tools, processes, and automation that surround software engineering improve beyond handwritten code in a text editor, this situation cannot improve. If the market continues to apply innovative pressure on the developers, the only way to catch up is to give developers a higher level platform to develop from. Twiddling around in the O/S, pushing bits around in a frame buffer, and spewing characters to and from a hard disk are far, far below the level where software engineering should be practiced, yet that's what most engineers have to suffer through given the relatively primative state of operating systems and development tools.
It's like trying to build a skyscraper with a hammer and a saw.
Shut up and eat your vegetables!!!
Lest anyone think that I'm saying the open-sourcers have "gotten it right" let me set the record straight. Closed source has its characteristic problems, some (but not all of which) can be addressed by looking to the open-source model. Open source also has its characteristic problems, which I'd say come down to lack of discipline.
The first symptom of this is that open source tends to be all about programming, without anywhere near enough attention to design, testing, documenting, etc. As much as we bash MS for using their users as guinea pigs, open source tends to rely on users even more heavily in lieu of real testing. Yes, I know, at least open-source users have volunteered to be guinea pigs and haven't paid for the honor, but I think that's an inadequate excuse for developers shirking an important part of their role.
The second symptom is lack of a means to control the jerks. I think the majority of open source folks favor cooperation, but a substantial number are more competitive than cooperative. They want to be top dog, or they don't want to be in the pack. When this attitude is recognized, they can be removed from a project by those that remain, but that recognition is often preceded by a lengthy period during which they're allowed to be obstinate and disruptive and generally counterproductive. When dealing with volunteers, it's harder to get people to shut up and do their assigned task, because there's no repercussions to them. They won't suffer for years from bad reviews or bad references, the fear of which is at some level a powerful motivating force in the commercial world not to be too much of a jerk.
As I said at the top, each approach has its problems. The benefits of open source may well outweigh the problems I've described, but it's not a panacea.
Slashdot - News for Herds. Stuff that Splatters.
It depends on whether we want to have accountability - of software to run airport baggage systems (refering to an oldish Scientific American Article called "The Software Crisis" which featured the Denver Airport programming disaster) - not to mention real mission critical systems like hospital life support, nuke plants, and my payroll. The SciAm 'solution' IS adopting 'formal methodes', at least for critical sub-systems - which basically means VERY expensive, time consuming, and very well thought out, kinda like the software in the space program - it may not be 'latest and greatest' but it's GOT to work, particularly for wo/man'd flights. I'm not sure I can trust the local whiz-kid or starving artist to fulfill that role. An artist or garage band can royally screw up and the worst that happens is nobody buys their art - but I sure wouldn't want a surgeon who has to go into a trance before cutting into the old appendix!
Licensing and professional organizations may SEEM like just an exclusive club but I think they add a sense of professionalism for critical jobs - they may still screw up, but then they can be 'disbarred' and booted out, held accountable - so we don't end up with just anybody claiming to be a power engineer, and having their system crash and kill thousands with the only repurcussions being 'opps! Sorry about that!'. But that's pretty much the state of the art with contemporary software licensing - the consumer bears the entire risk of product defect liability. Read any EULA. I'd like to see software where defects mean someone's head rolls on the production end! We used to call it "bet your job".
The Scarlet Pimpernel
try { do() || do_not(); } catch (JediException err) { yoda(err); }
However, stuff happens, and any problem at all is a chance for a politican to champion the interests of the people, and just as with so many other fields, we would never realize the wonderous future we had given up to benefit the careers of politicians and the fears of bureaucrats.
As for why there are some problems:
The benefits of good design such as extensibility, flexibility, and reusability seem less important now that a monkey can rapidly develop software with a slick interface using today's development tools. If software needs change, it is not such a big deal to write new software.
Most businesses are also ignorant of any critical and yet not blatantly obvious requirements such as security, scalability, data integrity, and reliability.
The way that this issue will be resolved in a free market is that the more far sighted companies, who are able to build on their past technology (like MS), will eventually out compete those who want it ALL and want it all NOW. Another way that competition will solve this problem is that companies will develop tools that make it easier to develop software that has a good architecture. Such technologies are currently known as components combined with application servers. Two examples are COM+ and EJB/NAS. Yet a third free market measure is certification tests like those given by Sun and MS.
The fourth, and perhaps the best argument against government involvement, is reputation. The reputations of companies and individual developers will become public knowledge given the Internet, and thus accountability will modify their behavior. Government on the other hand is not accountable - try to stop paying taxes - try to elect someone who is not a Republican or Democrat.
"But any larger software developers (this includes Open Source) should be splitting up the tasks."
..."
Splitting up tasks, yes; but I feel that almost everyone should have input (as in review) on the design process throughout the project. Design is never perfectly linear.
"Interface design
Uhh, I'll let the UI guys do whatever they want. They can also have input on design - as there can be conflicts between team goals.
"but just that as a good guideline they should not"
You must not be working in a very good team environment. Yes, some guys should be doing conceptual design -- but in my experience, logical design can be worked out in teams and even change as requirements sometimes do as the project progresses.
As a software consultant I change jobs somewhat frequently so I go to lots of job interviews and must stay in touch with what skills the industry is looking for. Invariably, when I'm asked to provide information on my work experience, nobody wants to know what aspects of the Capability Maturity Model I've found to be most useful in ensuring project success, what design and documentation techniques lead to testable event-driven user interfaces, or asked to discuss performance engineering trade-offs between a databases' conceptual model, logical model, and physical model. Nope, their requirements only want to know what programming languages, operating systems, and application types I've worked on. And they want the latest versions of this stuff as well. If you stay on and contribute to the successful conclusion multi-year project from start to finish, you will be really helping your customer but potentially cutting your own throat. And what's really ironic is that the worst programmers and engineers in this profession change jobs the most frequently and are therefor constantly exposed to the latest technology. I easily spend 10-20 hours a week and thousands of dollars a year (my book bill alone is approx. $2000/yr) keeping up with new technology. And it doesn't help when software tool vendors hawk their wares by duping IS management into thinking that using their IDE or modeling tool or methodology causes good designs, good code, good documentation to pop out the other end. A fool with a tool is still a fool. It still takes smart people doing smart things to make projects succeed. And until IS management understands this its going to be business as usual. And you will know when the change has taken place when the posted job requirements call for engineering skills rather that tool skills. Lets face it, a decent programmer can learn VB or Perl pretty quickly. But building reliable, scalable, distributed object-based systems on time and under budget ... that's tough.
I want to be alone with the sandwich
So these people should be used to a very meticulous way of designing things - but when it comes to a computer project it might as well be something sketched on a napkin. It is assumed that computer people don't need to have something designed and specified ahead of time. And computer people don't care because you can always quit and find a new job and who cares if the thing has bugs.
I guess the argument could be made that architects and engineers and professionals like that design things that can have life or death consequences. But these days how can you separate computers from any job? The engineer designing a new car is relying on crash simulation software designed by some untrained programmer somewhere. If the simulation produces bogus results, the car is designed and kills people, who is responsible, the car engineer or the software engineer? What if a shoddy print driver in Autocad prints out incorrect symbols on a blueprint and the roof falls in? I think to say that computer programs don't matter is simplifying things too much.
Programming is all about attention to detail, and knowing the results of your changes. Based on my experience, that isn't taught in school. Probably because the schools can't or won't assign large, team based projects to give students some real experience.
Started work in a shop that is in the medical industry. Since they won't pay well, they get the people that are willing to work below scale. We started with a COTS database package, and it is utter crap. It works more by 'magic' than by design.
The original programmers would do things like open a record set, count the number of rows until they found a match for the other key, and use that counter as meaningful data elsewhere. God forbid that the orignial record set would change.
Or the programmer that said 'oh, I thought that might happen' after I spent all day digging through his code to find out why it didn't work after his last change.
Nevermind that half the bugs fixed have side affects because nobody really understands how the system works, or why global variables are a bad thing.
Nobody here knows how to test to see if the code works, no one knows how to get real requirements, no one knows how to write code that does error trapping. I've spent 5 months trying to get management to buy into a peer review or at least a design review so that we can get out of a continual maintenance mode. Of course that would eliminate interfaces with 30 parameters, most of them named product1, product2, product3
No one else can understand why I spend 3 days writing code, then a week writing the test script, then another week writing all of the documentation. Oddly enough, they can't understand why I don't have to keep going back to fix my code. Hmm, wonder if the testing and the lack of bugs are related.
Sure glad I bothered to finish my degree in CS. Then I'd be as clueless as all the degreed people (some with Ph.D's) I've had to babysit during my career.
Becuase ThinkGeek is owned by Andover.net - that's why.
Who said that Andover buying Slashdot never changed anything.
Do you even know anything about perl? -- AC Replying to Tom Christiansen post.
Doesn't seem like there are that many competent design-teams about, tho, does it? :-(
I think the important thing is that the internal design should follow the interface design, not the other way around. I always start with the user interface, what sorts of objects and models I'd want to interact with as a user. This often suggests much of the implementation. You could call it outside-in programming, or something; design top-down, then implement bottom-up. Of course, for me, designing how things should work is a lot more fun than actually making them work, so I guess less than 50% of my pet projects actually ever get implemented.
A lot of programs, alas, seem to have started their design with a few simple internal classes, and layered as many UI elements over them as are needed to make the software usable at all, ending up with horribly counter-intuitive interfaces. (I've been guilty of this in rushed projects too, natch.) Then you end up having to add crud like Wizards to perform common operations because the normal interface makes them too hard. Yuck poo smell. And bum as well.
As it happens, I did used to write much of my stuff in assembler. Wouldn't say that exactly made me perfect, but hey. I used to be able to understand my programs at the time, as well. My habit of labelling subroutines .thing_thing_kludge or .john_prescotts_face doesn't make it entirely fun maintaining the code now...
(Of course, ARM assembler doesn't count anyway, since it is far too easy to be classed a proper assembly language.)
--
This comment was brought to you by And Clover.
For good software engineering practices to be adopted, I see one large hurdle. Everybody thinks Software Engineer == Programmer.
Programmers are the work-horses of the industry. They are the ones in the trench typing the code to get the daily jobs done. Perl is their friend.
Software Engineers are the ones who build large systems, they spend three-quarters of their time on design and review. This is the only acceptible way to build good large systems that aren't Crap. Perl is usually not their friend.
The problem I see is that most of Management assumes a Programmer can product a beyond-small sized program as good as a Software Engineer in less time. The Engineer will take 6 months to build a elegant system that scales well, and requires little maintenance in the future. The Programmer can do it in 4 month, but it will require a lot of maintenance and shoe-horning in the future.
Which one is better for the job? It depends, but in general Programmers are great at small one-off systems. The Software Engineer knows that true small one-off systems are very rare.
The Kernel Hacker is curiuos mix of Software Engineer and Programmer.
Comparing OSS and a need for licensing (and there is a need) is a huge red herring. The OSS process is intended to produce maintainable, repairable, and reusable code; who writes the code, on the other hand, is of no concern to the process. It exists whether written by rank amateurs or seasoned professionals. Thus a move towards licensure is neither pro- nor anti-OSS.
However, there are cases where who writes, or at least who signs off on the code is a concern. For example, industrial or other mission-critical software. Reputation may presently be sufficient measure, but over time a quantitative, rather than a qualitative, measure is required.
Licensing is chiefly a matter of lawyer-speak rather than a guarantee of competence (and any manager who expects otherwise is an idiot). This doesn't make it somehow unfair; licensure protects both the developer/engineer and the client through limits on liability and collective organization of developers/engineers. Bringing this back to OSS, any amount of code may be reused or appropriated from an OSS project; what matters is where you can lay the blame for project failure.
On the other hand, I worked as an electrical designer and the act of programming (PLC's, but still programming) was frowned upon by the old style EE's (and perhaps frowned is a nice way to say it). The attempt to bring software development into the engineering field can be viewed, and justly, as a power grab by the engineering profession.
I suggest another form of licensing, where a counterpart to the professional engineer's act (modify this as required for your jurisdiction) is enacted. This should give licensed programmers certain limits to professional liability, the right to organize and accredit programs, and a clearly stated purview for software engineering.
I don't, however, think that software engineering should become an exclusive profession with reserved duties, like many professions have become. Programming as an act is too broad for this, and the act of programming is certainly broadly distributed enough that anyone should be able to try their hand at it. With the rapid influx of computers into our daily lives, software should be written by all and sundry, most of all by the people who need them, and professional sw engineers should be only priviledged where absolutely necessary.
--
--
There is no premature anti-fascism. -Ernest Hemingway
The Bar Assoc and the Medical Board may protect their members, but they do a lot more.
They provide assurance of the credentials of the people they accept into their ranks. Some quacks slip through the ranks, but many fewer than would be able to practice were these governing bodies not there. The alternative is federal management, and that bodes ill.
I do not want a cheap, home-grown surgeon taking out my kid's appendix. I do not someone with little more than a strong opinion to represent me in a Court Of Law. I require proof of competency!
In the consumer market, software will most likely remain Caveat Emptor, but I do not accept the future where missle guidance systems, air traffic control software, embedded pacemaker logic and other critical systems are written by self-taught lowest bidders.
It is these fields where professional training, professional certification and licensing will debut. After that, we'll see professional designers offer higher-cost alternatives to commercial software - and some people will choose this over the quick and dirty versions.
Now, I won't argue that experience counts for a great deal. It's crucial. This is BTW why people fresh out of medical school have to do residency - where their every move is scrutinized and approved before it becomes terminal (pun int).
In mission critical, safety minded and heavy-financial application, where lives and big money is on the line, accountability is required. Even in many consumer goods markets, the sort of accountability and competency assurance that comes from having a Professional Engineer design the anti-lock brakes and air-bags is a Good Thing.
-- What you do today will cost you a day of your life.
Not to rain on your parade, I'd say that a properly engineered project goes at least as fast, and usually faster, than one engineered on an ad hoc basis. This is especially true for work completed for clients rather than internally, since they can use every excuse not to pay you. Having scope and spec on paper denies them that excuse.
Honestly, I wouldn't even consider working on a project without appropriate spec and scope laid out; it's a recipe for exhaustion and doomed to failure. I've done this in the past, but my self-respect is worth more than
However, this is a matter more of project management methadology rather than software engineering methadology. Why is it worth mentioning here? A software engineer isn't, or shouldn't be, just a code hack. They should be a leader, like a P.Eng is. Plain old developers are technicians - talented technicians, quite often, but they don't need to keep their eye on the ultimate goal of the project like an engineer or systems analyst would.
The techniques that you're mentioning are more development techniques than anything else. That isn't to say that they're unimportant, and they can be very important when you're rolling your own code as a researcher, but in the workday world they're of less and less importance as you ascend the food chain.
--
--
There is no premature anti-fascism. -Ernest Hemingway
The second year here (Reading) is basically the bits the department have to put in to get course accreditation from the British Computer Society. It includes Software Engineering and Formal Methods.
I don't know what US courses are like and that's certainly not the whole course, but it's a decent percentage and it's effectively requred over here.
Greg
Greg
(Inside a nuclear plant)
Aaaarrrggh! Run! The canary has mutated!
I recently left a shop (in disgust) that had been taken over by people espousing "Software Engineering" and McConnell. I had been through many crunch projects, and was tired of it, and was willing to give anything a try to be able to go home once in a while.
So, I bought a copy of "Software Project Survival Guide", read it, learned it, loved it. I was willing to start to implement the good ideas, and ignore the ones that did not apply to our warez, and make a go of it. We still had to make software, but there might be a better way.
Well, it turned out the the push behind our embracing of "Software Engineering" was not a way to get schedules and process under control, it was a new, novel way for executives (who were lawyers and accountants!) to micromanage the architecture and coding of our systems! We would generate all of the "Upstream" documents, and they would be picked apart by people who couldn't tell the difference between C and ASM. So, we went back, and regenerated (meetings, meetings, months).
The other problem was that during the time we were generating the "Upstream" documents, we were not actually coding. That in itself was not bad, but to people above us, it appeared that the only output of my group was the paperwork. Since no real implementation work could be done, then it was SIMPLE for the execs to drastically change the nature of the product we were working on. After all, we hadn't DONE anything, right?
After months of this, and 3 complete sets of docs, I left. I went to a small software house, and hacked for a good 3 months to get back into the groove. At the new place, we use some of the ideas in the "Big Orange Book", but we are thankfully able to concentrate on the real job: Making software.
Bottom line: Software engineering is a means to and end. Beware the motives of those who would make you concentrate more on that process, and less on the actual output. Make sure that the people managing the process are actual engineers.
Customers could care less about how you made the software, they just care about the end product.
Being able to effectively plan out your story, your characters, and how it unfolds is taught to most college students who take composition and literature courses. A writing class generally helps a person become better at communicating and arranging their thoughts in a succinct manner.
It's a top down technique with bottom-up feedback and iteration (rough draft, edit, next draft, edit, etc)
On the other hand, the vast majority of programmers are not taught techniques for arranging their "thoughts" and putting them into code effectively. Software engineering courses on campus are little more than a *REVIEW* of current SoftEng literature, and not much of a workshop. And usually only one class is required or even exists. In an english composition class, you might have to write 5-6 essays throughout the course of a semester, all putting into practice the techniques you learned.
So much time is spent in CS departments teaching algorithms, programming languages, and analysis, that precious little time is left over for teaching effective software composition. Which probably means that colleges need to make a distinction between Science and Engineering. Right now, colleges have both CS and IT classes (IT usually emphasizes technology, and not science), and I think IT should add more requirements related to teaching style and technique. After all, the IT people are the "grunt" workers who actually have to go out and design/build the bridge, not study the materials engineering that goes into the steel used to build it.
As a minimum, "engineers" in addition to getting some required science background, should be able to concentrate in "design", such as the following:
1) requirements analysis
2) design (booch, rumbaugh, jacobsen, design
patterns, et al)
3) process
4) management/team building
5) risk analysis
And, like any good engineering school, there should be heavy emphasis on actual real projects.
This is no way takes away from the "art" aspect of programming. Can't a scientist use his skills for building a bridge or building a sculpture? All I'm asking is that the people building the applications I use and depend on (and moreover, that the nation's infrastructure depends on) be a little more "serious" and a little less focused on "coolness" vs design/maintainence.
of course, anytime someone calls for this, there are always cries that it will kill innovation, passion, etc etc. Personally, I see far more "failures" than I do innovation from most of the amateur coders. People like to focus on the successes, but that doesn't give you the whole picture.
I don't want to sound overly harsh, but this comment is classic in many ways. It is exceptionally common and exceptionally wrong. The premise is, "I live in a disfunctional family. No-one knows how to communicate. Therefore, communication is an utterly useless skill". Communication is not useless, it is merely useless in this particular environment. If you fix the environment, you find that the previously useless skills become your best assets.
:-)
If you are working in an environment where you are always rushing, where computing theory has no place because there is no time to think, then you are working in a disfunctional system.
I believe that this type of environment is common in the industry for 4 reasons.
1. Get rich quick syndrome. Venture capitalists want to see a 20 to 1 return on investment on high tech firms. Breaking even is seen as a failure. The goal is to find a rapidly growing niche market and to dominate it. Quality products are secondary to market penetration. Features are everything (sell the sizzle, not the steak).
2. First to the market wins syndrome. For some reason being first to the market is seen as essential to obtaining market dominance. It is irrelevant that there are virtually no software products where the first to the market maintains dominance for the long term (I dare anyone to give me an example -- I can't think of any). Time to market is seen as more important than quality.
3. Like rewards like. If you work on a project, deliver tons on functionality and get it out the door really fast, you will be promoted. In fact, most people are promoted well before anyone realizes that their code was complete crap. In some cases, they may even get promoted before the product ships. These people maintain and extend the disfunctional environment (they promote the environment that made them successful).
4. A legacy of ignorance. People are not taught any better. How many people got out of school looking forward to the day when they finally get to work with fantastic people in industry. How many people fantasized about how much they would learn from software gurus that they would meet in their career. How many people were crushed when they got out of school and found semi-literate neandrethals (sp?) hacking away in the most bizarre ways. How many were disappointed to find that even if you could find one or two guys that knew what they were doing, that they couldn't (or wouldn't) teach anything to you. In a world where the experienced can't teach the newbies, everyone has to learn from first principles. You can't build on the experience of others. Only the very best people become at all competant. The vast majority struggle in valiant ineptitude.
Confusious said that if society is corrupt, then your must remove yourself from society. This is perhaps a bit extreme. However, you *can* change the world one step at a time. Think globally, act locally. Grab a new person out of school and become their mentor. Teach them what you know. Take responsibility for your own code. Struggle with all your might to add a small bit of quality to *your* code. Advertise your success. Dare others to match it. Propose a project to your management where you take a commonly used product and enhance it (you'd think that we would eventually learn from East-Asian culture...).
OK.... Enough ranting..... Maybe I should write a book
Of course a licensed programmer might write open source software. But that wouldn't make that software "licensed". Of course there's a place for both open-source and proprietary. My main point is that licensing doesn't guarantee anything about quality, but that's exactly what it will be advertised as. Software from a "licensed" developer will be automatically billed as better than from a non-licensed, and they'll charge more for it. The government will outlaw non-licensed code in certain areas. And that list of outlawed areas will inevitably grow. Amateur programmers will get slowly squeezed out.
First, make it work, then make it right, then make it fast, then, make it bloated!
The article discusses the process NASA uses in its attempt to write perfect software. And it does not require programmers to stay up all night
There certainly are both good an bad sides of these organizations. I wonder how 'corrupt' medical organizations would be if the Bar Association didn't make it so easy to sue a Doctor for malpractice. ;)
These organizations need to be held accountable for the practice withing the field they claim to advocate. For example, it should be a part of every legal oath (is there such a thing?) to not entertain a frivilous lawsuit (with parameters provided and kept up to date, to define such a suit), just as all doctors swear to 'first, do no harm'...
Also, you seem to suggest that teachers have no skills. If I misunderstand, then I apologise. Teachers need special training to impart knowledge onto students, especially in the age group most resistant to being taught. They need special training is child psychology, conflict resolution, structuring of the learning process and other things, that make education uniform across schools and regions.
The requirement of being degreed in Education in order to teach in any field is not true at University levels, and also not adhered to in many private schools. In these areas, an expert in the field is preferable - especially in education. Once education is no longer required, and students make the choice of being there, then the Educational training otherwise required is no longer needed.
But I do agree with you in principle. Education is a great place for a lazy person to get comfy... This is why the whole idea of tenure prings up a systemic deficiency in the educational system. It takes literally years to remove a tenured teacher from their position. You need to use the words 'sexual abuse' just to get the overseeing 'bored of ed.' to wake up and take notice.
Returning to the topic of the article though, Software Engineering is not the same thing as programming. The difference is that a programmer implements the design of the SE. The SE needs professional training and programming experience, the programmer needs skills. The degree to which the programmer has freedom of design is a managerial matter, dictated largely by the legal department, and mostly (in the final tally) by the accountants.
The engineering firm I work in has very few P.E.'s. Most are degreed engineers who just never took the PE exam, or don't bother to keep paying the fees for maintaining the license. The thing is that the PE's have 'sign-off responsibility' which allows them to authorize design changes. Even if the changes are the idea of a non-PE. They have approval, they are the ones to get hit if the changes are wrong, and they get paid a bit more for that.
As an SE/Programmer (still fuzzy for us in CS) I can make design changes, and all I have to do is get buy-in to the idea from other developers and management. I can argue the point, and the only repercussion for failure is that it was MY idea. My professionalism, or the integrity of my career or employability, is never at stake. Unlike an architect who is branded for life if his building collapses, when my software crashes, I get to say 'oops' and try again.
There are significant portions of the CS industry where this is not acceptable. Colliding jumbo-jets is one such area. Cratering a probe on Mars, because they said feet, and you heard meters, is another.
A P.S.E. certificate would not really set up a racket. I really don't think it would. It WOULD reduce wages for people who do not hold the cert. The head architect(s) of the system would still make in the six figures per annum. The guys that crank out 10 KSLOC per week straight out of high-school, having read a single VB in 21 days book would realize their value in the grand scheme of things right quick.
-- What you do today will cost you a day of your life.
They don't crank out a few million lines. They crank out a few thousand that make the million obsolete.
OK, so nobody is going to rewrite SAP on their own, but SABRE I'm not so sure about. Almost all significant new developements comes from individuals or pairs of programmers. It happens all the time.
Unix - written by Ken Thompson and Dennis Ritchie, while 100s of programmers worked on Multics, and 1000s worked on MVCS.
dbx - the best debugger of it's time written by 1 guy, while 100s of people worked on xdb. It was not only more powerful, it had more functions.
Borland, Lotus, Linux, even fucking microsoft. Later on large organisations grow around the original innovation, but the *significant* software does NOT come from large teams.
http://rareformnewmedia.com/
1. Because you can't verify that code is correct unless you understand it and can at least audit the source. This leaves out closed-source "objects". How do you know if you are testing all possible path through the code if all you can do is black-box testing?
2. Because there are no guarantees on software. Just read the license agreement on the next box of pre-constructed objects you purchase. "No guarantee of merchantability of fitness for purpose" leaves a hole big enough to drive a truck through.
3. Optimization. If you don't thoroughly understand the code, you can't fix bottlenecks that crop up in that code.
4. In the case of closed-source code reuse, you can't even step through it with a debugger unless you want to do it in assembly.
Another point. While it's very nice to learn OO design in a teaching language, it is the very unusual real-world application that you can code up in Scheme. And now that the buzz is wearing off of Java, I actually see a trend back to C++.
Because most of us are boycotting Amazon.
http://linuxtoday.com/stories/13652.html