Skip navigation.

exploreopera

| Help

Sign up | Help

There is no spoon

It is not the spoon that bends, it is only yourself

Posts tagged with "human factor"

Advice for the passionate and young software developers

, , , ...

I have gathered some advice for young and passionate software developers. It comes mainly from my experience and from my peers'. I hope it helps.

1. Be aware that programming is hard

Despite what Microsoft, Sun and other software development tools vendors want you to think, programming is hard. It looks easy though. Start an IDE, run a wizard, do some work in a designer, drag and drop database tables, automatically generate code and everything seems to work just fine.
Well, in 99% of the cases, it won't. Something will happen that will make your application fail, and because you used an IDE, a wizard, a designer and because you don't know what's going on in the backstage, you're in trouble.

2. You're not done when you've stopped writing the code

You get a task from your project manager, write the code, compile and run the application once to see if it's working. If it's working, it means that you're done.
No, you're not. You need to test it thoroughly before you're actually done. Yes, there is a tester in the team, but bugs caught early are much less expensive than those caught in the testing phase. The project manager will insist on this topic.

3. A programming job means continuous learning

The only constant in our lives is change. You feel this even more in IT. New hardware, new software, new programming languages, new tools come up every year. There are good news however: the basic principles haven't changed in 25 years. Understand them and you will be less surprised. The bad news is that it takes time to understand them.

4. The technology used is not essential

C# is good. Java is good. Perl is good. Python is good. Hell, even Cobol is good. (Only VB and old ASP are evil :-D.) Each of them for their own domain. Learn them all. The more languages you learn the easier will be to learn more, and you will find innovative and effective solutions for your projects.


5. Solve the problem

Be pragmatic. You work for a project because somebody has a problem and they want it fixed. Find the best way to solve it. Yes, there are limitations. Yes, you can't always use the ideal solution. This is why you are asked to solve the problem and not a computer. There are no recipes. You have the capability to adapt to the situation. Solving the problem is the fun part, too.

I hope that helps!


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

"Security in software development" trainings

, , ,

I've been very busy those two weeks trying to put together a training on security issues for software development. It wasn't an easy task, though I've had a continuous interest in security and in what it means for software projects.

The first difficulty is to concentrate a massive amount of information in sessions of 1h 15' - 1h 30'. I could talk for hours about encryption algorithms, about their history, what they mean in litterature and the amazing story of Enigma - how it was decrypted and the influence this had on our own history -, but there's never enough time. Then there are a lot of exciting facts from information theory that never get into such sessions. It's a pitty; on the other hand, when I train people on security topics, I'm never short of interesting stories.

The second difficulty is to present the human factor in security. The people who read this blog know that the human factor in software development is the central idea of my articles. It's not different with security. The need for security is a central fact in the human psychology. We have to understand this need if we want to produce secure applications.

I structured my training such that it's possible to deliver it no matter of the technology used by the trainees. It has a few common tracks, on the core topics of security, and it then has specific tracks that are technology specific; currently, I'm only covering .NET, but I can very simply add Java, PHP, C++ and other technologies on a need basis.

And here comes the final announcement: at some point in the (near) future, I will release the training materials under a Creative Commons license. I hope this will make them better and better, allowing many people to learn about the security issues in software development. So, stay tuned ;-).


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

The Ego in Software Development

, , , ...

I have recently stressed the importance of having a team formed from very good developers in order to obtain software quality. I received interesting feedback regarding this statement, including one issue related to the ego of programmers.

The problem goes like this: you gather your best developers and ask them to work on a project. Instead of producing much more than the average programmers, they fight over design, libraries and principles.

I believe that there are a few key problems when this happens. First of all, design by committee has proved to be an anti-pattern. Second of all, because software development is about ideas, all projects should start with prototype implementations that are refined during the project's consequent phases. Third of all, there's the Ego Problem.

It is easy to see that developers often have an oversized Ego. That aspect can be very good or very bad for a project.

Let's take for example Linus Torvalds. Whenever he talks in public, he says "I'm always right, you're wrong. If I don't like what you say, I may say you're ugly and stupid". That's certainly an oversized ego.
On the other hand, nobody can say that Linux is not a succesful project. More than that, Linux is organized in such a way that Linus Torvalds doesn't control all its phases. And there's even more to the story: Linux might not have been so succesful if Linus Torvalds had a smaller ego.

I've also met the other type of developer. The one who thinks that knows everything, the one that doesn't agree with older and smarter people from the industry. The one who thinks his ideas are very bright when they actually are really bad mistakes. The one that tries to impose his solutions to everybody else.
I guess that this phenomenon takes place in Romania because the IT industry doesn't have tradition, doesn't have values, and it's not settled yet (actually, like the whole society). People still try to be original when they should just listen to the voice of the experience.

But what is different between Linus Torvalds and John Developer My-Solution-Is-Always-The-Best?
You can probably name a lot of differences. Knowledge and understanding are a few of them.

I believe that the main factor differentiating a Good Ego from a Bad Ego is the intellectual honesty.

If you read what Linus Torvalds says, you will see that he has no problem to point out his mistakes and his limitations. That's normal, because he works in an open environment, where all mistakes are noticed. If he doesn't talk about them, the others will.
At the other end of the spectrum, John Know-It-All will never accept he's mistaken, even if you prove it with all the resources you can. He will find out all sorts of ways to prove them wrong: "Those people don't do what we do", "This is theory", "I haven't seen this work" etc.

So there's one point to look for:

A person with a Good Ego is his/her first critic.

Intellectual honesty also includes the willingness to learn. Not only the technology you work with, but everything related to software development. Yes, that's hard, takes a lot of time and it's frustrating because you always find out you made mistakes. But software development is hard.

Continuous learning is the best way to transform a Bad Ego into a Good Ego.

My experience includes many moments of enlightment and of realization of my mistakes. I've come to understand that mistakes are part of life and that we should take maximum advantage from them. Understanding our mistakes and finding ways to correct them is how we evolve intellectually. During this process, a Bad Ego is transformed into a Good Ego.

The answer? Look for people who are intellectualy honest. This is an absolute requirement for what I call "good programmer".


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

Entropy in software development

, , , ...

Quite often I hear developers or managers acting very surprised about the fact that an application "doesn't work".

I am never surprised when an application doesn't work. Probably because of my engineering background, and probably because I can still remember the second law of thermodynamics:

The entropy (=randomness, disorder) of an isolated system which is not in equilibrium will tend to increase over time, approaching a maximum value at equilibrium.

This law states something that we all know intuitively: it takes effort to move things in the desired direction. It doesn't matter whether we're talking about a carpenter trying to build furniture, a cleaning person trying to keep a room clean or a software developer trying to develop an application.

This means that the normal state of things is for an application not to work according to specifications. That's part of the reason why programming is hard: you have to fight entropy.

The reason why people are surprised with an application that doesn't work is that they don't realize just how hard it is to fight entropy in a software project, avoiding in the same time the other big enemy: complexity. Many people don't understand that programming actually means working with ideas.

What comes as a natural consequence of the above law is that I am always nervous when an application we develop seems to work fine. That's just not natural.
When I say "seems to work fine", I mean that there is no reasonable proof of the fact that the application is working fine. Of course, we can't prove that an application just works (no matter what marketing tries to tell us). But there are many examples of projects that were driven back because they lacked this proof and because they discovered at some point that inside the seemingly good working box there were many lurking bugs.

The first rule that results from this reasoning is:

Never trust your developers when they say the application is working fine.

Only trust them when they prove it to you with: unit testing, functional testing, beta testing (with real users) etc. Developers' mindset is about making the program work, not making it fail. That's why not many of them are good at testing their own modules.

In the end, remember that it's normal for an application not to work. It's unnatural when the people working on it say that it works without investing too much effort into it. The entropy is hard to beat.


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

The essential difficulty of software development...

, , , ...

... is that we are working with ideas, not with material items.

The relation between people and ideas is fundamentally different from the relation between people and material items. For one thing, material items are perceived in the same way by different people (unless some of the participants are under the influence of some perception-altering substances). Material items can be described completely by diagrams and numbers.

The IT industry has gone to a great length of defining ways that would allow completely describing ideas. We have UML diagrams, templates for writing technical documentation and so on. We have ways to describe data and the transformation it suffers. We also have ways to describe the user interface.

The problem with the description methods we're using to describe ideas in IT is that:
  • It's really difficult and time consuming to completely describe an idea (try to read Kant or Hegel to realize how difficult it is)
  • Different people understand the description differently
  • It's difficult for people to understand the description completely, to take into account all the details

Besides this, ideas evolve, and the people who need the application expect them to be easily included in the implementation. It's very difficult to dissociate an idea from its programmatic representation. Ideas are easy to modify; the implementation is itself immaterial; so why is the implementation so much difficult to change than the idea itself?

In order to prevent misunderstandings from happening, we are testing the "materialization" of the ideas; in other words, the implementation. But how do you test an idea? It's not a matter of fitting a mechanical piece in a mechanism. It's about comparing the mental image of the idea with the actual implementation. But you can't actually touch it, move it, look at it from all angles; at least not physically.

And then, there's the relation between users and their applications. The computer is different from any other tool known to man because of a few key characteristics:
  • It processes information and the result is information
  • It gives good results only when given good input
  • It gives wrong results in any other situation
  • The user cannot touch an application

Therefore, the user has to form a mental model of the application and of how it works. So we are back to the same problem of perception of ideas. The user's mental model about the application is not bound to be the same as the one of the developer, of the producer and so on.

This essential difficulty is responsible for the most problems we face in software development. And, because it's an essential difficulty, there are no ways to avoid it, only to alleviate its effects.


The first solution that comes into mind is to minimize the communication chain. If the mental model gets more corrupted the more it travels then make it travel less.

Open source is a succesful model because the people writing the software are the same people who need it, and they can take decisions regarding it. In other words, they are bound to have a similar mental model because they need the same thing, and they are free to adapt the ideas.

Agile methodologies are succesful because the communication chain is the shortest possible. The customer is part of the team and he is the one explaining the mental model directly to the people responsible with materializing it.

All the other methodologies have proven in time to be impractical. Completely documenting an application in UML is less productive than writing the application and adapting it as it goes. In fact, completely defining an application means that we are creating a complete representation of the application in another language, and isn't that exactly what programming does? Except that you can run a program and you can, with some extent, use your senses with a program. That's impossible with another abstract representation of the same idea.

The other way to alleviate the difficulty is to use the right people for the job. Since defining a mental model for the application is a human problem, it's dependent on the individual. People with the right mindsets and with a certain mental agility that allows them to adapt to exotic mental models manage to form a mental image that's much closer to the one that's transmitted to them. And, with experience, they come to the point where the fill in the missing parts with the correct pieces of the puzzle (for a very interesting discussion on the expert mind, see this article).

To summarize, if you want your software project to be succesful, do the following:
  • Minimize the communication chain between the vision and the implementer
  • Use the right people in your team


I believe this to be the basis for any succesful software project.


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

5 things managers don't get about software development

, , , ...

1. Software development is creative work

How do we know that's true: All rules that apply to creative work are known to give results for software development. For example: write the program, then re-write it at least once (see [1], [2]).

How do we know managers don't get it: The cubicle. The noise. Any other environmental factors that kill creativity.


2. Managing an IT project is different than managing projects in other domains

"In many ways, managing a large computer programming project is like managing any other large undertaking — in more ways than most programmers believe. But in many other ways it is different - in more ways than most professional managers expect."
(from [1])

How do we know that's true: Practices that work in other industries don't work in software development (for example adding more people to a project to make it end faster or motivating people with "the employee of the month" program)

How do we know managers don't get it: They still think people are interchangeable in a project team and they still use ineffective motivation and recruiting techniques.

3. People are more important than processes

How do we know that's true: No software company has succedeed only based on processes. Instead, all software companies that are very succesfull have very good people. The best example is Google.

How do we know managers don't get it: They still insist on the work processes instead of attracting talented people and instead of making sure that they reject the wrong people. (See [3] for an interesting story regarding this issue).

4. Good developers are cheaper than bad developers

How do we know that's true: Data from the industry shows that good developers can be up to 10 times more productive than bad developers (see [1]). From my own experience, there are cases when bad developers can be even worse than that. But good developers are never paid 10 times more than bad developers.

How do we know managers don't get it: They prefer to hire cheap but mediocre developers instead of hiring talented people.

5. No bad developer has ever become a good developer

How do we know that's true: Even Bill Gates said it. There are studies about it (see [5]).

How do we know managers don't get it: They still hope that bad but cheap developers will learn in time.

References:

[1] Frederick Brooks, "The mythical man month"
[2] Eric S. Raymond, "The art of Unix programming"
[3] Paul Graham, http://www.paulgraham.com/colleges.html
[4] Joel Spolsky about recruiting software engineers: http://www.joelonsoftware.com/articles/GuerrillaInterviewing3.html
[5] Saeed Dehnadi, Richard Bornat, Research Study about Programmer Aptitudes, http://www.cs.mdx.ac.uk/research/PhDArea/saeed/


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

I'm not a C# developer or a .Net software architect; I'm a software developer, period

, , , ...

Managers and marketeers have a thing with names; they have to translate everything into something easy to digest and that sounds nice.

I've been called during my career names like: C++ developer, .Net developer, .Net software architect. During my first years in the industry, it seemed OK. Now I know better.

It's true that I've worked mainly with Microsoft tools: Visual C++ 5.0, 6.0 and Visual Studio 2003, 2005. It's true that I've used Microsoft libraries: MFC, ATL. But that's only the surface.

I believe that what I did is more important than what language I used. Let's see a short list:
  • I designed and implemented (with the help of my mentor) a custom database engine optimized for read only operations
  • I improved the performance for a number of applications
  • I worked on a number of tasks related to networking (sockets and stuff)
  • I designed and implemented a resource locking subsystem in a distributed application
  • Now I'm designing and implementing a Domain Specific Language

While knowing a programming language is necessary for all the above tasks, it's not enough.

On the other hand, I have evolved much besides the Microsoft world. I am currently using Linux at home, and loving it. I have finally understood functional programming only a couple of years ago, although I had passed an exam on this topic in college. I have understood that this whole discussion of patterns, procedures and other buzz words is futile; it's only programming. I have read about and used, within the available time, languages like Python, Ruby, Haskell, Perl and others. (In fact, even when working on Windows, I have a Cygwin instance open at all times so that when I need something I can quickly go in Python). Oh, and I know C, C++, Java, Javascript and C#.

For me the holly wars between Java and C# or any other two languages is just a pointless waste of time. If I think a language does a better job for what I need, I'm using it. If I think I need a new language, I'm designing and implementing it.

Finally, everything comes down to a few simple rules:

Be responsible
Know what you're doing
Take into account the advantages and the disadvantages
Use the appropriate tools
Solve the problem


So please, don't call me names; I'm a software developer, sometimes a software designer.

Update: Martin Fowler talks in his last bliki post about the different languages available for the Java platform. It seems we're on the same page about multilanguage projects...


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

Writing less code is good for your software's health

, , , ...

In a previous post I criticized some of Jeff Atwood's ideas. Today it's time to step in and defend him.

Jeff Atwood's today post talks about being able to run a program in 600 lines of code. He calls for an exercise in minimalism:

What can you build in 600 lines of code? Think of it as an exercise in minimalism. Does your preferred language or environment allow you the freedom to create something interesting and useful with that constraint in place?


The comments to this post are mostly jokes for a matter that is quite really serious.

I suppose that everyone's heard by now that the software industry has a horrible failure rate. 30% of projects never finish, while other 30% of projects finish but not in the due time and/or budget. That leaves only about 1/3 of the projects that are really succesfull.

Imagine now that one in three cars would explode and another one would be delivered one year late. Or that one in three houses (bridges, airplanes and so on) would fall apart. This is the sorry state of the software development industry at this point. Our only luck is that our mistakes kill much less people than other industries.

There are many reasons for the failure rate. Some of them are related to the fact that most managers don't understand how software is produced and don't know how to improve the process (hint for the managers: read for starters "The mythical man month", "Code complete", "Peopleware" and "Software Estimation: Demystifying the Black Art"). Some of them are related to the education of programmers.

When all those things are done well, the final product has a few characteristics that show it's good. The Tao of Programming explains it in a very expressive way:

A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity.

A program should follow the `Law of Least Astonishment'. What is this law? It is simply that the program should always respond to the user in the way that astonishes him least.

A program, no matter how complex, should act as a single unit. The program should be directed by the logic within rather than by outward appearances.

If the program fails in these requirements, it will be in a state of disorder and confusion. The only way to correct this is to rewrite the program.


The connection between good software and fewer lines of code is well documented (again, see "Code complete"):

The more lines of code your software has, the greater the number of bugs.
The more lines of code your software has, the longer it takes to solve one bug.
So writing less code helps you write good software.


Any software can be written badly. The experience shows that this category of software usually fails. So, how's it gonna be?


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!

A cultural phenomenon

, , , ...

Ever since I started to learn about computers and programming (I've read my first book about computers when I was about 10 years old), I've had a profound interest in the history of the domain. Not only the history of the first computers, but also about the cultural history of software development.

I don't know how many of the young programmers realize that they are part of a very alive and original culture. For me, the geek culture fits like a glove; many times I didn't know that a certain book or movie influenced the thoughts and ideas of the legends of programming, but I knew that I loved it.

But what is this culture coming from? Well, historically the programmers had certain tastes in books, movies, music a.s.o. Usually their interest lied in science, science fiction and very strange humour.

Let me give you some examples. The british humour group "Monty Python" was so influential on the geek culture that some people who decided to design a new programming language named it after the group. You guessed it: it's now called Python. Its documentation is filled with samples of the group's (really strange) humour. One of my favourite Monty Python quotes relates perfectly to many IT projects: "The purpose of this year's expedition is to see if there are any traces left of the last year's expedition" - from the Kilimanjaro sketch. (Hint: replace "expedition" with "project" and you get the point)

Another example is Douglas Adams' five parts trilogy "The hitchhiker's guide to the galaxy" (Hint: Forget the movie; you have to read the book). This book was so influential that the "answer to the final question about Life, the Universe and Everything", computed by the most powerful computer from the galaxy, namely the number 42, has a myriad of cultural references in IT. The simplest one that you can find is when you google for "the answer to life, the universe and everything".

J.R.R. Tolkien's masterwork "Lord of the Rings" is another notable part of the geek culture. More recently, the movie "Office space" created a number of memes, notably the TPS report. And so on.

As I said before, I feel that I am part of this culture. As a result, it was only natural that I participate to it. Therefore, when I thought about how should I name the domain specific language for rules that I'm designing and implementing for my current project, incidentally related to semantic web, I heard a bell ringing. See the result below:

One language to Rule them all
One language to find them
One language to bring them all
And to the ontology bind them


I hope that's not too much for my readers ;-).

PS: Please Mr. Tolkien, Sir, don't turn me into something unnatural...

Soft skills in software development

, , , ...

I think that the developer's soft skills are not stressed enough. There's no curriculum, lecture, book, blog or journal that talks about soft skills necessary for effective software development.

The issues are of course mentioned. Frederick Brooks in "The mythical man month" and Steve McConnel in "Code Complete" talk about communication, about understanding the customers and so on. That's not enough, though.

The two things that helped enormously my career until now were soft skills: Foreign Languages (English and especially French) and Empathy. Of course, the hard skills are important, but that's covered pretty well in the litterature.

My knowledge of French allowed me to work with French speaking customers, thus enlarging my experience and my demand. The empathy allowed me to understand my customers, to understand their needs, to minimize the communication time and to deliver what they requested. An interesting fact is that I've educated my empathy by studying people during the college years, and today I congratulate myself for that.

So here it is, another remark regarding the human factor in software development:

Empathy is largely underestimated as one of the main factors that contribute to the success of a software project.

If you can understand your customer, your co-workers and the human nature, the only obstacle between you and a succesful software project is taking the right technical decisions. And who takes them? Again, the team members. Wouldn't it help if they could communicate effectively with each other? You bet.


Personal advertisement: I am PassionIT and help teams that develop high quality software. I train, I help improving and I work hands-on, depending on the needs. Contact me if you need help.
Alexandru Bolboaca-Diaconu



Add to Technorati Favorites  Digg!