Tuesday, March 31, 2009

Is software evil?

Michael Osinski compares his creation -- software that enabled the creation and selling of complex mortgage products -- to another "evil engineering" feat, The Manhattan Project.
I have been called the devil by strangers and “the Facilitator” by friends. It’s not uncommon for people, when I tell them what I used to do, to ask if I feel guilty.
Osinski claims his software, Intex, dominates all the investment bank mortgage departments, and I can confirm that my investment bank used and continues to use it. So, Intex certainly played a role in the financial crisis.

It remains far short of the old Manhattan Project though on the evil scale. A better metaphor would be the creation of some math formulas that the engineers used in the Manhattan Project. The toxicity resides in the product, not so much in the tool that created the product.

But, still I find the question intriguing: should software engineers consider the ethical ramifications of their work?

Would you have any problems being hired to write software that:
  • recorded key entries and mouse clicks without the user's knowledge?
  • tracked people's on-line browsing behavior without their knowledge?
  • breaks passwords through repeated guess submissions?
  • connected adults looking to cheat on their spouses?
  • scanned public email of all Americans, not just those suspected of illicit behavior?
  • simply stored and queried the data from the database of public email?
  • infiltrated government servers and stole political information, such as GhostNet?
  • disabled thousands of servers, i.e., a worm or virus?
  • stole money from people's checking accounts?
Somewhere between the first and the last, harming someone else becomes explicit and intentional. Osinski's case sits close to the first, where the ultimate damage caused was far removed from the purpose of the software. (Excel was probably just as much to blame, if not more.)

Also, somewhere between the first and the last, everyone finds a line that they wouldn't cross (or at least think they wouldn't).

Think about the application you work on. Could someone likely be hurt by it? Is it likely to be used for illegal purposes? Should you care?

Monday, March 30, 2009

Better software through connecting

This past weekend, I went to the dreaded DMV -- Dept of Motor Vehicles. If any government agency brings forth horrifying images of incompetence, bureaucracy, and disaffected employees, it's the DMV. Even though I was just renewing my license, I took a huge book, in preparation for long waits and lines.

I never even cracked the book. I was in and out within 15 minutes.

Actually, I can't remember ever having a bad experience at the DMV. Mediocre, maybe, but not bad. Yet, the imagery persists in my mind, and I would guess most people's.

I was thinking about this because it seems like a large percentage of IT shops have similar reputations. They do decent work, pump out a good share of deliverables, chip away at the list of problems. Yet, they are perceived as slow, lazy, and second-rate.

Some problems are about basic management, all of which practices like Agile addresses: expectation setting, progress tracking, frequent user feedback, quick error identification.

But, it's often not a competence issue. At the DMV, where things were effective enough, what I noticed is that none of the employees seemed happy. Occasionally, you'd see them joke with each other, but the customers were like fish they had to process. All interactions were perfunctory, not personal.

Government agencies don't have a lot of leeway to show personality, but there's no real excuse for a software dev team.

No matter how good your applications are, a weak relationship with your users will doom you to a negative or, at best, mediocre reputation.

If your users work in the same building or nearby, one of your primary jobs is to get physically in front of them regularly. Daily is about the right frequency, for every person on the dev team from the intern to the manager. Ask how things are going. Get to know them as people. Connect.

As technical people, we often focus on the technical specifics that our users request. We neglect the personal aspect of the job. Yet, the definition of a service is that it's personal. The products get outsourced.

It costs nothing to be friendly and engaged with your users. The payoff is that your apps will be better, even if they're the same.

Friday, March 27, 2009

7 things that make a good manager

My manager being out on jury duty has led me to continue to muse about what makes a good manager. I'm thinking about it in terms of software teams, which means managers on car production lines could be very different.

I figure I've had about 20 jobs in my life, starting with the afternoon paper route I took on when I was 10. So, I must have had around 30 direct managers during that time. Surprisingly, I can only think of one or two that I absolutely could not work with. Of course, some were mediocre, but still had valuable good qualities. Several have been outstanding. Perhaps I have been lucky.

Here's my list of the most important things that a manager does, in order:

1. creates an environment that enables you to succeed. This can include both positive attributes (e.g., gives you enough authority to make the decisions that you need to, provides access to the required resources) and negative (e.g., beats back and filters scope changes and new requests, shields you from the political noise).

2. challenges you with "stretch" assignments in new areas. This could be new technology, leadership, or new responsibilities. In any case, you face the requirement to develop new skills, and that keeps it interesting. Of course, you have to be ready for it, and a good manager knows how far to stretch you.

3. ensures you are properly rewarded for your efforts. Many developers I've worked with have a difficult time asking for a raise or expressing their desire to be promoted. A good manager takes care of that and fights hard to get you recognized, while you are toiling away behind the scenes, away from the spotlight.

Both 2 and 3 are really flip sides of the same coin: motivation. There are numerous ways to motivate people, but they essentially boil down to personal development or public recognition. Everyone wants both, but everyone also has priorities, so some people will prefer 2 to 3, and others the reverse.

4. mentors and teaches. I have really appreciated managers that were vastly better than me, and I loved to step back and watch them work. The great ones explained their methods, identified areas where I could improve, and presented these issues to me in a way that encouraged me to do better -- as opposed to feeling worse and inadequate.

5. provides vision. At the "worker bee" level, it can be hard to see where the department is heading, much less the company. You might feel your efforts are Sisyphean, pointless. A good manager provides strategic direction and explains how your efforts contribute to that, while maintaining honesty and authenticity.

6. organizes the team to encourage interaction. Your co-workers represent your best learning opportunities. A group that works together will be more powerful than a bunch of individuals pursuing their own goals. Frequent and positive interactions often require the right structure or the right incentives to encourage them.

7. acts as a friend. Some people have told me they didn't want to be too "chummy" with their workers out of fear that they wouldn't get the respect they needed on the job. I've never understood this. I consider myself friends with all of the best managers I've had -- people I would want to invite to my sister's wedding. I maintain that it's always easier to work with people that you have a friendly rapport with than those you have only a business relationship with. Especially in software development, respect comes from being effective, useful, and knowledgeable, not from having a commanding personality.

Wednesday, March 25, 2009

Software development as group activity

The stereotype of a software developer is a kind of loner cowboy who gets the job done.

What bugs me about this is that, occasionally, a developer will create something from scratch that the guy in the next cube built a couple years ago. Or the implementation will be ill-conceived, even though the best architect sits no farther than a paper airplane could fly.

This makes me appreciate Agile development. I find it gets developers talking, even if it's simply an extended version of, "I'll do this, you do that." Developers who talk about their work are more likely to generate new ideas or solve problems effectively.

Teams are powerful.

In my experience, the basic tenets of Agile development -- e.g., daily scrum, rapid iterations, burndown, backlog -- together provide a useful scaffolding for getting individuals to work as a team. The first time I got all the pieces working, I was actually amazed at how the team took off on its own. The individual parts of Agile practices actually serve as a metaphor for a team: each part can be ineffective by itself, but together they become very powerful.

I only wish for better alternatives to pair programming. The guidelines for pair programming seem oppressive -- switching pairs every 4 hours! I haven't yet met anyone who actually does it as specified, and I haven't been courageous enough to try it myself (nor strong enough to convince any of my bosses).

But I definitely like the idea of getting programmers to work even closer together.

Jeff Atwood mentioned a very clever idea (which he apparently had 4 years ago) for how to screen for developers who will be more inclined to work with others:
I have my own theory about the ideal way to interview developers: have the candidate give a 10 minute watercooler presentation to your team on something they've worked on. I think this is a far better indicator of success than a traditional interview. You'll quickly ascertain:

  • Is this person passionate about what they are doing?
  • Can they communicate effectively to a small group?
  • Do they have a good handle on their area of expertise?
  • Would your team enjoy working with this person?
This is absolutely something I will try.

Tuesday, March 24, 2009

Are you a good manager?

One simple measure of your value as an employee: when you say you're taking a few days off, how concerned is your manager?

Does the opposite also hold true? Yes, it's a crude measure, and it's just one, but I think it goes the other way, too.

If you manage people, do you think they're relieved when you're out of the office, or are they worried? Are they more productive, or less?

My boss has jury duty, so she's out for at least a couple days, and possible more. That worries me. Every day that she's out, I get increasingly bogged down by administrivia, "emergency of the hour" fire drills, unfocused and not well considered requests, and thorny problems that don't seem to have good answers. These issues grow until, after a couple weeks, it takes most of my day.

One of the most important jobs of a manager is clearing and filtering impediments, interruptions, and distractions so that the people that work for you can do their jobs. Clearly, my manager does that.

On the other hand, we've all heard of the opposite type, too -- the kind you wish would just leave you alone. The kind that everyone's glad when he's on vacation. I've been fortunate not to have very many of these in long career.

Do you manage people? Which type are you?

Monday, March 23, 2009

Data hell, part 2

A question came in, What do I mean by data hell exactly? (Presumably from a UI guy :-)

Here are some of the characteristics:

1. duplicate data in multiple tables. Of course, data from one table doesn't match the others -- it never does because that's what happens with duplicate data.

2. no primary keys on tables. How to identify programmatically the exact row that you want? Not easily. Sometimes filters work in the right context -- e.g., "I know know there's only one manager in New Jersey, so I can filter to New Jersey and get the right manager." Painful.

3. columns that act as pseudo-primary keys vary by table, even if it's the same data. For example, every car has a unique license plate. That's the primary key for Table1. Wait, every car also has a VIN. That's the primary key for Table 2. Now join them together. Exactly.

4. the pseudo-primary keys aren't reliable. The column in Table1 that holds license plates has VINs for some rows. The join suggested in #3 to Table2 actually works -- sometimes. When? Hard to say.

5. cross-keys aren't reliable. To solve the problem, VIN is often added to Table1 or license to Table2. If you're really "lucky", as I am, you'll have both in both. Unfortunately, sometimes the two keys are out of sync, as predicted in #1: a car gets in Table1 with the one license and VIN, the VIN matches to a VIN in Table2, but that row in Table2 has a difference license.

6. multiple naming conventions. Can't remember if the column is spelled "licenseNum", "LicenseNum", "license_num" or other variations with "number", "no", etc.? That's because each table has a different variation. Often, a table will be consistent with itself (though often it won't be), but different programmers add new tables and bring their own convention without concern for fitting in.

7. just lots and lots of bad or missing data. Data entry just not happening reliably.

What do you do about it? It depends on how much time you have.

If it's a long project, you painstakingly fix the data in some key tables, make sure the input processes are clean. Then you build out from there, either refactoring tables or fixing data at each point along the way. All the while, you try to fit in other business requests as you can.

Sometimes, the business can't wait, and the requests pile up faster than you can take them off. Your only hope is to hire some good database developers and work like crazy. Keep at least one or two of them away from the firing lines, so they can fix things in the background.

Worst is if it's a short-term project. You might think that, being short-term, that is the easiest. Ride it out until it winds down, right? If you've been an app developer for any amount of time, you know that apps very rarely die. If the app works, someone will find a use for it. But, because it's considered short-term, no funds will be invested. It will go on living like a zombie. The people who keep these things going are real heroes.

Thursday, March 19, 2009

I had forgotten what data hell felt like

Now I remember, thanks to the new databases I have inherited!

That is all.

Wednesday, March 18, 2009

Bonuses bonus

I was done talking about bonuses, but the subject refuses to go away.

I'm not outraged by AIG's bonuses mainly because Merrill's bonuses outraged me far more. (Apologies to my friends at Merrill.) But, getting them back wouldn't bother me either.

One person on my trading floor said, upon reading that a bill would be passed to tax the bonuses at 90%, essentially clawing them back, "It's the end of capitalism. Some of these guys work 100 hours a week."

These guys do work hard, but I hardly think capitalism is at stake. I once worked over a 100 hours a week, including shifts that exceeded 30 consecutive hours, over a summer for an average of $7.50 an hour. If anything, capitalism will be healthier if we have a smaller range of salaries.

While many of the people who will be giving their bonuses back did not cause the problems, their bonus guarantees were probably born of continued expectations of fat profits through financial derivatives.

Not causing the problem is not really the issue, though, is it? What if developers started a job and refused to fix bugs because "I had nothing to do with the creation of those problems"?

More importantly, at the end of the day, everyone should be expected to work hard. While I will say, having worked with both bankers and software developers, that the former work much longer hours on average, a good percentage of highly-skilled developers work 60 hours as week (and, of course, some work more). They might earn between 100 and 150k. Does working another 50% more hours justify 1000 to 2000% the salary?

Bursting any bubble hurts. Right now we're witnessing not just the burst of the housing and financial markets bubble, but also financial industry salaries. Ouch.

Tuesday, March 17, 2009

Simple things to help keep your job

These days, lots of people worry about losing their job.

You might feel more comfortable if you knew all the source code intimately, were a technical genius in every architecture and language, and knew as much about the business that your app is used in as the people who use your app.

All good things to work on, but this post is about things you can do that take almost no time, effort, or money.

1. Show up on time. Most dev shops have fuzzy start times and fuzzy end times. Most developers start late and work late. Yet, consistently showing up on time signals that you are reliable. It helps others include you in important conversations or events. Few of us are morning people, but this is a small price to pay.

2. Call ahead when you're going to be late. I once got a call from someone at 11 a.m. saying they were going to be late and they didn't want me to wonder if they were coming in. Uh, I was already wondering. Again, the primary issue here is that you want to give the impression of being reliable. In addition, there's no excuse to call when you're already half way to work; call when you get up and it's already obvious you'll be late.

3. Attend group social events. If the team is getting a beer after work, you could get a soda if you don't drink. You don't have to spend a lot of money, just buy one drink and nurse it. This is actually a great way to strengthen your work relationships. Your interactions become more natural, and that can help you when, for example, you need to bother someone to get help sorting out your java threading issues.

4. Volunteer for internal groups. If your department needs a social planning committee, or the company is looking for members to join a diversity group, sign up. This will take a few hours of your time, which you shouldn't let interfere with your work, but you'll be making contacts outside your team. You can also try out some new responsibilities, like project management or dealing with vendors.

5. Give a presentation. What have you been working on? Offer to give a training. It will seem as if you are doing the group a favor; meanwhile, you're actually practicing your public speaking skills, sharpening your thought organization skills, testing yourself on how well you know your work, creating documentation, and interacting with people you normally might not or at least in different ways.

6. Be courteous and treat people with respect.

7. Tell your manager as soon as you think you might take a day off. Someone told me once at 5 pm on Thursday that, "oh by the way, I booked myself on a weekend getaway, so I'm taking tomorrow [Friday] off". Again, perception of reliability is being hurt, and you might be causing your manager real scheduling pain that could easily have been avoided. Maybe you're afraid that you'll change your plans? I'm sure you're boss won't mind if you decide to work on that after all.

In a sense, these things are free, always have been, and yet it surprises me how often people don't do them. Maybe the current job climate will generate a few converts.

Monday, March 16, 2009

One way to know you are good

Everyone thinks they're exceptional. After all, 70% consider themselves above average.

You can test how good you are by taking a job where you are expected to be a senior person: project or team lead, architect, technical expert. The newer the better: new industry, new programming language, new tools, new responsibilities.

Now, how long does it take for you to make a contribution to the team, to go from being a net receiver of information to a contributor, or, said another way, becoming someone who answers more questions than asks? How long does it take to generate unique insights about the application or the team's problems? How long until you become the go-to person in certain areas? How long before things emerge that only you can do?

If you have truly exceptional skills, the answers to all these questions will be "very quickly" or thereabouts.

Sometimes, you find out that what made you strong was just having been in your previous position for a long time or you've just been doing it longer, not that you were particularly gifted. Nothing wrong with that -- that's highly valued by any manager.

But keep that in mind when new people come, and they need your help or they don't seem to be as quick as you are.

Sunday, March 15, 2009

"Forced entrepreneurship"

I think of software teams as entrepreneurs. Not just because so many software companies are start-ups trying to find a niche. Even at big companies like where I work now, the entrepreneurial spirit drives the success stories.

Read this NY Times article about laid-off workers putting their creativity to do new things. The subject of entrepreneurialism fascinates me, because the good IT departments at my company, as well as the good small companies where I have worked, all have that same spirit.

At one start-up I worked at back in the 90s, we had a huge client-server installed base. Eventually, Java and web service type applications showed too much benefit, and we jumped with two feet into that space. What made that a great time was not the relief that I could strengthen my resume, but being surrounded by individuals who eagerly threw away everything they knew, where we were experts, for the chance to try some new things, where we were rookies.

At larger companies, organizational bureaucracy may crush the entrepreneurial spirit. But, I also find that a large number of the people who come to larger companies no longer have a hunger to learn, or even a curiosity about what is going on around them.

The best IT departments in our company attack problems like something personal is at stake, as if they were laid off, and it's now up to them to find solutions, to try new things. This can be difficult -- there is a lot of organizational bureaucracy of course -- but that should be the aim of every team and department. If yours is lacking that, then figuring out how to change it becomes the top priority.

Thursday, March 12, 2009

Gaming search engines for 15k a month

This article gives the inside scoop on how to manipulate search engines and blogging to generate lots of traffic and earn lots of money via AdSense. It seems one step removed from a scam.

I say "seems" because on closer read, I conclude that it is a completely legitimate business practice. In fact, it may be the future of newspapers, or, rather, what will replace them.

The author's basic strategy is this:
Your goal is to build a site which contains everything someone would ever want to know about your root keyword.... Now you have some original high quality meat for your microsite which is truly original content and is highly targeted for each long tail keyphrase.
Later, he markets the site by connecting to other authors and experts on the same topic, and creating a self-referencing blog.

Ultimately, this is exactly how people have always built businesses. They create a product -- say, "Rosetta Stone" language software -- then run infomercials about it. Or, they investigate a subject, write a book, and tour the country promoting it. (Malcolm Gladwell comes to mind.) The only difference is that this replaces monetary cost with technical know-how.

It is the kind of job that only technically savvy people -- do-it-yourself, non-corporate programmer types -- can do today. Tomorrow, it will go mainstream. But today, there are a growing number of these kind of jobs available to the right individuals.

Meanwhile, he has done a tremendous favor to the people who were interested in a somewhat obscure subject, by sorting and centralizing an ocean of information and creating new, relevant content. That's not gaming the system, that's providing a highly-focused news service.

Welcome to the golden age of information!

(Thanks to Jose for the pointer.)

Wednesday, March 11, 2009

The volunteers that work for you

What if you viewed the people that worked for you as volunteers?

Volunteers, of course, don't owe you anything. Treat them like crap, and they'll disappear.

How would your management techniques change? How would you motivate them? How would you get the bad, boring jobs done?

It's not impossible. I've worked at several organizations where the volunteers were willing to do mundane, thankless, even painful jobs at great personal effort. Sometimes, I was that volunteer.

It's an important question, because in a very real way -- more than ever, and even moreso in the future -- that's what they are: volunteers. They can leave, especially the ones you need the most. And "the cause" is more near and dear to their hearts than any a non-profit could offer: a job that interests and challenges them (while offering financial rewards, of course).

Monday, March 9, 2009

Who's fault is it?

Ever had a good idea? Maybe something simple, like changing the color palette of the app to shades of blue. You brought it to the team, they mostly ignored you.

Later, it turns out, you were right. The users hated the existing color palette. Responses indicate blue would have been best.

Who's fault is it?

In an ideal world, we wouldn't ask this question. Instead, we would move on to "what do we do now that we're in the situation we're in?"

But, usually the person asking this question is the person who suggested the blue colors. "Those idiots should have listened to me. It's all their fault the app looks hideous. I told them to change it to blue."

How hard did you push to change it to blue, though? Mentioned it once?

Often, you have to push an idea several times before people stop and hear you. More importantly, you have to be able to express why blue would look better or appeal to customers. If you can't do these things, then people would have to follow your idea slavishly -- hardly a good idea. If you didn't do these things, then it wasn't really an idea that you were willing to bet on.

A parallel would be the guy who says he knew a month ago Citi shares were going to drop to $1. How many shares did he short? Zero. People would pay millions for accurate advice like that. He could have quit his job, instead of working for peanuts. But he knew.

If you have an idea, you need to put your money down, put your reputation on the line. Otherwise, it's just words.

Many successful projects of all sizes -- Google Reader, Facebook, open source, to name some software examples -- faced strong opposition. They got done only because someone believed enough in it to put their reputation on the line, and communicated the brilliance of the idea convincingly.

Thursday, March 5, 2009

Motivation and complaints

The other day, I met a woman who was full of complaints. Lots of people didn't submit their data correctly, and that created work for her. The building maintenance crew made some lovely improvements, but far too noisily during work hours, which distracted her. And so on.

All valid complaints actually, but I got worried because we were on the same project team. Was she going to drag her feet the whole time for one reason or another?

I kept my concerns to myself and plunged in. And came away surprised and delighted at how productive and helpful she was.

I came to realize that she just liked to have everything lined up before beginning. Work environment, data, clear sense of objective -- once these were in place, she could move mountains. The main point of her complaining was that it prevented her from getting to it and doing an awesome job. She was totally self-motivated, but in the wrong environment, her review might have contained phrases like "reluctant to jump in" or "a negative distraction".

Far from dragging her feet, she actually wanted to race, and cursed the clutter that blocked the starting line.

Wednesday, March 4, 2009

What's the value of 10 seconds?

I love this creative use of software.

As you must know, some sites require you to translate a distorted word and type it in when leaving comments, to filter out spambots. The guy who helped create that system "realized that he had unwittingly created a system that was frittering away, in ten-second increments, millions of hours of a most precious resource: human brain cycles."

It could be defended as a small cost and necessary evil, but he decided that surely all that power could be harnessed for something useful. So he reinvented it.
If you've visited those sites [e.g., Facebook], your squiggly-letter-reading ability has been harnessed for a massive project that aims to scan and make freely available every out-of-copyright book in the world, by deciphering words from old texts that have stumped scanning software.
For example, through this effort, every issue of the New York Times, back to 1851, will be digitized by the end of the year! Which just goes to show, the sum of those small costs was very large, indeed.

This reminded me of another fascinating application that I learned about from a former professor of mine, the excellent Panos Ipeirotis. In his class, he mentioned the esp game, a very clever way to get real people to label images for free. Google licenses the game to improve searches on its millions of images.

As with fuzzy words, people interpret pictures better than computers. Both of these applications struck me as being like manual grid super-computing networks.

No wonder, then, that I later came to learn that both applications were created by the same guy, Luis von Ahn. I also came to learn, through my professor's blog, that von Ahn has recently started a blog. Full of interesting ideas, no doubt. We are in the golden age of information!

Tuesday, March 3, 2009

Maybe it's the game that's the problem

Watching the season premiere of Celebrity Apprentice last Sunday, one of the contestants made a comment that shocked me. (I watched the kickoff last year too, and that was the only episode I saw.)

The comment was that Dennis Rodman should be fired from the team because Rodman didn't have a good work ethic. What?

We're talking about one of the greatest rebounders and defenders in the history of basketball. He won two Defensive Players of the Year awards. He once had 34 rebounds in a single game. His contracts often contained memberships to 24-hour weight-lifting gyms, because he worked out so much.

Clearly, he does not suffer from a work ethic problem.

But, it is also true that Rodman contributed very little to his team on Celebrity Apprentice. He required heavy coaxing for every small effort.

He stated that it was never clear to him what everyone's role was, including his own. He could have been just rationalizing his bad behavior, but there is still some truth there. Rodman's the kind of guy who needs to know his role, who likes to focus. In his basketball career, he didn't look to score very often.

The primary challenge of a software development manager is to motivate the team. People aren't successful, and often the reason is, "He wasn't motivated" or "She wasn't a hard worker." This is particularly relevant to software development because most companies want only self-motivated coders, due to the solitary nature of so much of the work. "Here's the source code, here's a problem description, go to it." Frequently, there's no training. If you're the right person, you'll figure it out.

Yet, how many Dennis Rodman's get the boot as a result? No doubt, motivating someone like Rodman is a huge challenge. (Fortunately, he would surely hate coding.) On the wrong team or with the wrong coach, Rodman was only a disruption, a "bad apple." Instead, he was a major factor in 5 championship teams.

Some people really do have a poor work ethic. A software manager has to distinguish the ones who aren't motivated from the ones aren't getting the right motivation.

So let me change that sentence. The primary challenge of a software development manager is to figure out what motivates each team member. Everything else flows from there.

Monday, March 2, 2009

10 papers every programmer should read

Michael Feathers says everyone should read these at least twice. Pointers like this -- filtering the many papers he's read over the years down to these ten -- are invaluable.

I found all of them online for free, except for #8, so I added links for them.

1. On the criteria to be used in decomposing systems into modules - David Parnas html pdf

2. A Note On Distributed Computing - Jim Waldo, Geoff Wyant, Ann Wollrath, Sam Kendall pdf

3. The Next 700 Programming Languages - P. J. Landin pdf

4. Can Programming Be Liberated from the von Neumann Style? - John Backus pdf

5. Reflections on Trusting Trust - Ken Thompson html pdf

6. Lisp: Good News, Bad News, How to Win Big - Richard Gabriel html pdf

7. An experimental evaluation of the assumption of independence in multiversion programming - John Knight and Nancy Leveson pdf

8. Arguments and Results - James Noble

9. A Laboratory For Teaching Object-Oriented Thinking - Kent Beck, Ward Cunningham html pdf

10. Programming as an Experience: the inspiration for Self - David Ungar, Randall B. Smith pdf