Software Creation Mystery - http://softwarecreation.org

First Anniversary of SoftwareCreation.org

Dear Readers,

This June is the first anniversary of SoftwareCreation.org. I want to share few notes about this glorious event. I dreamed about having a blog for few years, but I didn’t want to spoil our great web space with just another miserable stream of poor writing. Even one year ago I had at least three good reasons why I shouldn’t blog:

  • I’m not a native English writer. Prepositions and articles are still rocket science and source of troubles for me (Russian doesn’t have any articles at all). Composition of good English sentences is a serious mental endeavor. I love English, but I’m missing a lot of language nuances, idioms, abbreviation (e.g. WTF) and touching expressions that children learn from fairy tails, TV shows, mischievous friends and cursing adults. English is not music for my right brain, but hard parsing work for my overloaded left brain, at least now.
  • I wasn’t born as a good writer. I don’t have natural talent to seamlessly compose beautiful flow of words that spark imagination, amaze people and make them forget about their work, wives and even computers. On the contrary, it is much easier for me to produce long boring and difficult to digest logical statements than to create masterfully prepared delicious food for your brains.
  • I don’t know much. I live not too long, I didn’t read as much as I want, I know only fraction of what other people know and I didn’t experience many software projects.


These good reasons and my sanity didn’t stop me and I’ve started blogging. I wasn’t able to keep to myself my interest, amusement and passion for creating software.
Software development is much more than writing code for computers, implementing design patterns and algorithms (I should admit - this is very interesting part too).

  • People. They add vibrant life into this dry process. Software development without people is similar to the birthday party without beer and guests. People bring power of human intellect, creativity and ability to solve impossible problems. But they add many exciting difficulties: we should understand each other, learn to work and think together and deal with our irrationality, personalities and feelings. Oh, yes, I forgot to mention that people write programs.
  • Problems. Customers and users expect that software could solve their craziest wishes. And they are right - software becomes important part of our human civilization: it empowers businesses, science and societies, and makes life of kids and adults much more fulfilling (and entertaining). The problems become more wicked and interesting as we are building systems for unending people needs and push limits of what is possible for computers. Our civilization becomes hooked on software more than on oil, gas and coal. Therefore, civilization need smart guys who could deliver software for challenging demands to keep the whole world going :)
  • Craft. Software development is one of the few remaining professions that still brings enjoyment of building the product from idea to a complete solution with own hands. This profession requires pride for own work and traditions of craftsmanship combined with high level of mastery, knowledge and skills. Good programmers are intelligent creators and masters and aren’t narrow-minded pluggable work units for solving purely technical tasks. Software development is so complicated that we won’t see serious competition from soulless AI soon.


What are results after one year?
52 posts, more than 45,000 visitors and more than 400 feed subscribers.

And I found much value for myself:

  • Better knowledge - most of the articles are product of my learning. As I don’t know much, I find interesting questions and problems and try to answer for myself. In addition, presenting an answer for other people is much more challenging and require much deeper understanding. My blog is one of the best Universities for myself :)
  • Improved communication - I’m becoming more comfortable with English and its expression power - my brains become tuned to this music and even sometimes cooperate to produce nice sentences. Also I learned that the way information is delivered determines what people will get and understand. I’m trying to enhance methods of delivery (visuals, concise ideas and better organization) and make my writing more approachable and interesting. And yes, I know, I’ll never be Shakespeare or Tolstoy, but I’ll be happy if people find something worth of their attention in this blog.
  • More meaning - this blog adds more positive moments to my predictable and sometimes boring life. Opportunity to share, discuss ideas and connect to others people makes my life more meaningful and interesting. And this inspires me to spend more time writing than playing on a computer or drinking beer.


What do you think about this blog? What I can do to make it better?

My Dear Readers, thank you very much for your valuable time spent here! I’ll do what I can to make this blog worth even more time from your busy lives.

Happy birthday! Cheers…

Truly yours,
Andriy

P.S. I have another blog-related dream that I want to implement soon. I want to create separate blog where other people could share their stories about software projects, interesting situations and software development crowd, their managers and customers. What do you think? Does anybody want to share any stores? Please write me to andriy@softwarecreation.org if you are interested, have stories, comments or ideas about this new blog.

Comparing Intelligent Software Evolution to Chaotic Biological Evolution

Software Evolution is similar to a Bible Story: we, software creators, have a plan and goals and pursue them to create the perfect solution. We carefully select and add new features according to our grand design. We try to keep design clean and optimal. Things sometimes go wrong and the software system goes berserk, but we intentionally intervene and fix the problems to continue fruitful functioning of the system.

Biological Evolution is a different story: chaotic raise and fall of different species, without any plan and goals. New traits and variations appear all the time and many are useless or even harmful. Small modifications accumulate over time, cause significant changes and emergence of new species, better adapted for the evolving world. Survival of individual organisms and species is the matter of chance, pressure from environment and competition with other organisms.

Intentional growth of software versus chaotic evolution of organisms… Do they have anything in common?

Biological Evolution

In biology, evolution is the process of change in the inherited traits of a population of organisms from one generation to the next.

Species - a group of organisms that can reproduce with one another and produce fertile offspring.
Population - a localized group of individuals belonging to the same species.
Traits - particular characteristics of an organism.
Genes -portions of DNA molecule, which control inherited traits.
Genotype
- complete set of genes within an organism’s genome.
Phenotype - the complete set of observable traits that make up the structure and behavior of an organism. These traits come from the interaction of its genotype with the environment.
Variations - the variation in phenotypes in a population reflects the variation in these organisms’ genotypes.

Most of the genome of a species is identical in all individuals of that species. However, even relatively small changes in genotype can lead to dramatic changes in phenotype: chimpanzees and humans differ in only about 5% of their genomes.

Read full post >>

The Happiness. Programmer’s Edition.

Happiness is a direction, not a place. - Sydney J. Harri


tookie

Happy programmers are more productive, healthier and live longer. It is pleasure to work with happy programmers. Are you a happy programmer? Do you have feeling of joy and satisfaction every day? Do you want to know how to become happier?

This post considers programmer’s satisfaction with live as a whole (I had another post dedicated to happiness at work).

Programmers as other people are happier if they have

  • more money
  • successful marriage
  • excellent health
  • good friends
  • live in a beautiful place with wonderful weather


But we have what we have. It is not easy to achieve all of this: become rich, find perfect spouse and friends, be completely healthy and move to the best place on the Earth. But the most nasty news is that even after achieving all of this happiness is not guaranteed to last forever.

Read full post >>

The Secret of Building Effective Software Systems

I can’t wait to share this simple secret with you right now.

The Secret: Effective Software Systems are the systems that easy to understand and operate with human brains.

Programmers are more productive with effective software systems. Programmers can better learn and grow these system. Programmers have less problems, work faster and make better decision with them.

Now, you can avoid spending time reading this post if you already know this secret and you know how to avoid building the software system that:

  • almost impossible to understand in reasonable time
  • has confusing and convoluted swamp of logic and structure
  • scary to change as nobody has any clue what will be broken, but sure that it will be broken


If you are still interested, lets find out what makes software systems effective.

Software Development is a pure mental endeavor (except typing on keyboard) that includes 3 main activities:

  • Understand - learn and know system concepts and implementation
  • Evolve - build, modify and support growth of the system ideas in the code
  • Share - communicate and exchange ideas about the system


Programmers should care about 7 areas to make the system better suited for our brains:

  1. Knowledge Creation and Retention - parsing, memorization and comprehension of the system ideas
  2. System Organization - elements, relations and structure in the system
  3. Sustaining Emerging Order - support evolution of the system and gain control over chaos
  4. Minimize Noise and Purify - avoid adding unnecessary stuff to the system
  5. System Discovery and Learning - making sense of the system
  6. Mental Models - our internal explanations for how things are working in the real system
  7. Shared Knowledge - ideas exchange, reconciliation of opinions and creation of mutually enhanced knowledge.

Read full post >>

Top 10 Qualities of The Perfect Programmer

Who are the perfect programmers?

Popular blogger Alex Iskold answers in Top 10 Traits of a Rockstar Software Engineer:

  1. Loves To Code
  2. Gets Things Done
  3. Continuously Refactors Code
  4. Uses Design Patterns
  5. Writes Tests
  6. Leverages Existing Code
  7. Focuses on Usability
  8. Writes Maintainable Code
  9. Can Code in Any Language
  10. Knows Basic Computer Science


It is a solid list, but this list concentrates on the secondary traits, which are just consequences of the deeper set of qualities. And it is an idealistic list. Do you expect the same qualities from a Flash programmer for kids websites and a software engineer for B2B financial transaction services? But how can we recognize a perfect programmer in the crowd of developers?

The Ultimate Criteria for finding The Perfect Programmer: The perfect programmer delivers good software that meets client’s expectations.

Therefore, the shocking truth is that perfect programmers could know only one programming language, don’t have any idea what are design patterns and don’t program all nights in their basements creating the next Google. We cannot objectively measure the programmers perfection like you could measure diameter of your biceps. The perfect programmers are simply perfect if they deliver a quality, usable and maintainable software system [a good system] in time and meet client needs.

Read full post >>

The Programmer’s Brains At Work: Understanding The Software System

“The important thing is not to stop questioning” - Albert Einstein

A typical programmer faces thousands lines of code, huge number of details and millions of situations and states during the software system execution. A programmer should understand the system, know how to modify it and support knowledge about the system with explanations, justifications and answers. How can a software developer gain, maintain and operate this knowledge and make sense of these volumes of information and complex logic changing every day?

The ways how our memory works could give us few hints.

Our Human Memory Architecture

Read full post >>

Five Big Personality Traits of a Programmer. Do They Matter?

“Variety is the spice of life”

Did you see a software team with members that are

  • always stressed and full of fear to fail or completely indifferent to end results?
  • totally agree with each other and satisfied with their product, but very far from harsh reality?
  • competing and fighting for the true solution, but cannot achieve common goals?
  • always inventing something interesting, but cannot focus on work and deliver software?
  • overly disciplined, planning everything, but deliver mediocre boring results without any spark of imagination?
  • having excellent communication, rapport and environment, but spend most of the time talking than working?
  • sitting in separate cubicles without talking, barely understanding what others are doing?

Can these teams be successful? What is the root cause of their problems? How these problems could be prevented?

Our personalities


One of the most interesting things about humans is their personality. We are different in behavior, reactions and feelings in the similar situations. These wonderful personality traits make our life refreshing and sometimes totally unpredictable. Do they matter in software development, apparently logical and rational activity? I believe that people are the most important factor in the software development and they determine success. A programmer’s personality affects behavior and therefore it must have significant impact on the work itself.

Empirical research shows five broad dimensions of personality:

  • Openness - appreciation for art, emotion, adventure, unusual ideas, imagination, curiosity, and variety of experience.
  • Conscientiousness - a tendency to show self-discipline, act dutifully, and aim for achievement; planned rather than spontaneous behavior.
  • Extroversion - energy, positive emotions, and the tendency to seek stimulation and the company of others.
  • Agreeableness - a tendency to be compassionate and cooperative rather than suspicious and antagonistic towards others.
  • Neuroticism - a tendency to experience unpleasant emotions easily, such as anger, anxiety, depression, or vulnerability; sometimes called emotional instability.

What are the best personal traits for the programmer? Before answering this question, I want to mention research of rudimentary personality traits in wild animals. Small birds, great tits, have personality ranging from highly exploratory to more cautious one. Scientists found that the both personality types are optimal, but under different conditions. When resources were scarce it paid the birds to dispense further. However, when resources are abundant more cautious birds were more likely to survive. Morale is that our evolution preserved different personalities for the good reason. They help us to survive and advance under various unpredictable conditions. They made overall population resilient to changing environment, threats and challenges.

Software teams need diversity not only in skills, experience and knowledge. They need the optimal balance of personalities to effectively build software, especially in our rapidly changing technological, business and social worlds.

Read full post >>

How a beautiful software system becomes Frankenstein

“Ruin in community is not caused by witches with broomstick but it’s something that starts in people’s heads.” - Prof. Preobrazhensky (Michail Bulgakov’s “The heart of a dog”)

The newborn software system looks beautiful inside after the few weeks of development. Several talented programmers put their souls together into this amazing software idea. But week after week the system become older and uglier. It could still look exciting for users, but the system rots inside. It is much more difficult to modify, it breaks often, development time and cost soars. Programmers become scared to work with it. The system becomes Frankenstein. Why could it happen?

Three reasons

There are hundred objective reasons why it could happen - complex technology, changing customer needs, management pressure, time to market and many more. But some teams still deliver a good system under these conditions. And some teams cannot deliver even in the most favorable conditions. Why?

Degradation of the system starts in the people heads and there are three main reasons:

  1. Incomprehension - developers don’t understand the purpose, ideas, design or technology behind the system
  2. Inarticulateness - developers unable to express ideas through clear and effective architecture, design and code
  3. Inconsistency - developers cannot act consistently or don’t care about the system

Read full post >>

Can In-House Programming Compete With Outsourced Software Services?

Thought-provoking and interesting author Nicholas Carr has published a new article in Financial Times, where he expands on his ideas about transformation of IT services into utility. He compares IT with electric power generation 100 years ago:

Like data-processing today, power generation was assumed to be an intrinsic part of doing business. But with the invention of the alternating-current electric grid at the turn of the century, that assumption was overturned.

Suddenly, manufacturers did not have to be in the power-generation business. They could run machines with electric current generated in distant power plants by big utilities and fed to their factories over a network of wires. With remarkable speed, the new utilities took over the supply of industrial power. Scores of private power stations were dismantled.

Read full post >>

The Programmer’s Mind: Gut Instinct, Focus and Procrastination

New Scientist published three interesting articles related to the human psychology. This post tries to apply these findings to the programmer’s mind.

Should a programmer trust gut instinct

In the article The subconscious mind: Your unsung hero, author argues that contrary to common beliefs non-conscious thinking is better in some cases than rational, conscious thought:

  • where people have to make difficult choices based on large amounts of hard-to-assess information. Subconscious thought processes allow us to integrate complex information in a more holistic way
  • in problem solving, verbalizing what they are doing has no effect on people’s ability to solve analytical, mathematical or logic problems but actually hinders performance on insight problems, such as solving a riddle
  • subconscious thinking is the source of our inspiration - it is central to creativity. In highly creative people subconscious information is more likely to overspill into consciousness, giving them richer mental resources from which to make creative connections

Creativity and problem-solving are required for any descent programmer. This article shows that these skills are dependent on quality of our subconscious thinking - gut instinct. Can we consciously improve our subconscious thinking? Yes, and the best way is getting experience and making many mistakes. Certainly, it will work only if you learn from them. As famous quote says: “Good judgment comes from experience. Experience comes from bad judgment.” Especially it is true in the software development.

Short Summary: trust and develop your gut instinct.

How a programmer could keep focus

Many of us struggle with distractions during our work. They really hurt our productivity. Psychologist Nilli Lavie says in the article Focus feature: Keeping your mind on the job:

You don’t have voluntary control - you can’t say ’stop’ to a ‘distracter’. If you wish to ignore something, that doesn’t mean that you will succeed.

Surprisingly, he found that when a more visually intensive task “loads” the brain’s attention, we become increasingly blind to distractions, and our performance on the task will improve: reaction times get faster, and error rates drop. That means that the harder you are forced to concentrate, the less likely you are to be distracted.

Therefore, conclusion is simple for programmers - a challenging task will force you to ignore distractions, a boring task will make you very susceptible to them.

Short summary: load your brain to avoid distractions

Procrastination in programmer’s life

Another productivity killer is procrastination. Piers Steel at the University of Calgary in Alberta found a formula for procrastination:

Utility = E x V/G x D
This calculates how likely you are to do something immediately - the task’s utility - by taking into account the four key variables: how confident you are of succeeding in the task (E); how pleasant you perceive the task to be (V); how easily distracted you are (G); and how much time will elapse before the reward for completing the task arrives (D).

He suggests strategies to cope:

  • Make a firm commitment to your boss or partner to finish a task by a certain time.
  • Strip your workspace of all distractions.
  • Get a good night’s sleep and try tackling the most unpleasant and difficult tasks early in the day.
  • Set a series of realistic goals.
  • Promise yourself a reward for each goal that you meet.
  • Believe in yourself.
  • Outsource your motivation. Get someone else to regularly goad you into action.

I can promise - you’ll find even more strategies in various sources. I had a related post too: 5 steps to cooperate with you unconscious mind. But after all, you’ll get results only if you have desire to improve and change yourself. As Plato said: “The first and the best victory is to conquer self.” Chinese wisdom adds: “A journey of a thousand miles must begin with a single step.”

Short summary: it is possible to fight procrastination… if you really want

Links (unfortunately, all require New Scientist subscription):
The subconscious mind: Your unsung hero
Focus feature: Keeping your mind on the job
Procrastination: The thief of time

Software Creation Mystery - http://softwarecreation.org
This work is licensed under a Creative Commons Attribution-Noncommercial-Share Alike 3.0 License .