Super Smart Developer Training Program

February 21, 1999 - Jack Harich - Go Back

There are only a few dozen key principles and best practice areas that, once mastered, can transform the average developer into one that is super smart. The latter can leap tall problems in a single bound, get most designs right on the first iteration, intuitively discover or apply the optimum abstractions, and handle vast mega-abstractions like Ultra High Reuse Technology adroitly.

The key to achieving this is continual self improvement.


Goals and Questions

Some top goals are implied above. Are these your goals? Probably not. Write down your goals, and we will help you achieve them. A goal is a specific event occuring by a certain date. Without a date there is no incentive for closure. Attainable goals have a plan to achieve them and are easy if the plan is followed. Examples are:

  1. Master the Gang of Four patterns so well I can apply 90% of them intuitively. I'll do this with 3 practice projects, one a month, plus an essay with my own models on the 23 patterns. This goal will be complete in 3 months.
  2. Become such a good "Defensive Programmer" that my defect rate is 20% of normal. This will be done by studying Code Complete in month 1 to 2, the JCON code in month 3 to 4 and recording my own defects in months 4 to 5 with pattern and root cause analysis. I'll accomplish this goal in 6 months.
  3. The ability to take a manager's request for a new subsystem all the way to completion by using the Mini Process and interviewing the manager to get started. First I'll find good examples, study them closely, modify a few of my old projects to adhere to these standards, and then do all my work at this level of quality. Then I'll do at least 10 serious projects through the Mini Process cycle. I'll achieve this goal at average level of results in 6 months and at a superlative level in 1 year.
  4. Be able to take a "small" customer concept all the way to a product. This will be done by first mastering the Mini Process (above goal) and taking 5 to 10 progressively more difficult products all the way. The customer may be in house or outside, and this is more than your average manager's assignment in that it is a complete product. I'll achieve this goal in 2 years.
  5. The ability to apply Declarative Knowledge principles to my designs for high reuse. I'll do this by studying related literature, the Bean Assembler, building at least 3 snall practice systems and identifying and using DK in at least 20 places in my company's software. Emphasize the modeling step. I'll achieve this partially in 6 months and fully in 2 years.
  6. Hitting 95% reuse routinely in my work with a variety of techniques. I'll do this by measuring reuse in my projects, and developing the ability to predict my level. I'll also study the literature plus JCON models and code. I expect to hit 80% in 6 months and 95% in 18 months.
  7. Mastering the modeling step so well my group sees me as the expert there. This is hard, so I'll go the Immersion, Imitation, Innovation route, which works for any difficult area. I'll allow 6, 12 and 6 months for the stages, becoming an expert in 2 years.
  8. Starting a life long continual improvement program with significant daily investment. I'll do this by averaging 2 hours a day on "improvement" 7 days a week for the rest of my life. I'll subscribe to Software Development and Object Strategies, read at least one book a month on principles (not tactics) and apply it, regularly review my own work for improvement, and learn about process, where improvement can be highly leveraged. To validate progress and allow analysis I'll log my improvement time for the first 3 months. I can start this within 30 days.

Next, are you motivated to achieve your goals no matter what? If not, stop reading right here. There is nothing we can do to help. You can lead a horse to water but you can't make it drink. We don't mean become obsessed and turn the world upside down, but we do mean your self training motivation must be a top priority in your life.

Next, how motivated are you? Are you excited about learning better ways? Do you have the hot burning desire to get to the bottom of all the top software issues of today? Are you willing to cut back on watching TV (addictive, input and not output, the brain antrophies and you never know it) and start "reading the classics"? (the experts in your field, the best periodicals, the local high quality study groups, the really good lists, groups, websites) Are you willing to pick your new friends wisely? (intelligent, untroubled, witty, happy, motivated) Remember, quality attracts quality. As you can see, we are talking about a life style commitment. The goal is hard to achieve, and so the means must be extraordinary. For example Jack has averaged 10 hours a year of TV for the last 20 years, reads 2 books a month, has the finest of friends :-) and is obsessed with mastering whatever field he's in.

And now, what is your time budget for self study and practice? If it's not at least 2 hours a day on the average, forget it. There is a certain threshold above which the mind makes rapid progress. Below that progress is too slow, and you may be forgetting concepts as fast as you learn them. Jack's personal budget is 20 hours per week to master a new field, such as OO or Java. That's how he broke into both of them. Take stock of where your daily time is going. Unless you don't need self improvement, you are usually frittering away at least 2 hours a day.

Have you resolved your risks? If you are stressed out, fix that. Subtle concepts cannot penetrate an unclear mind. If you are unhealthy, fix that. In general the keys to good health are nutrition, excercise, low stress, and laughability. ;-) Do you have low self esteem? Fix that. If you have a young family at home, you may find it impossible to study there. Get your employer to buy into this document, which is not hard, and study at work 2 hours a day. Avoid a work versus family time problem, and put your family first. Resolve any other obstructions.

Things get harder. Can you discriminate between the interesting and the useful? If not, you will be wasting your's and other's time. Instead of talking about cool TV shows, talk about that powerful new pattern you discovered. Instead of talking about a good editor, talk about how you've discovered that since the average developer produces 10 to 30 lines of code a day, the editor doesn't matter a hoot, but requirements and design are where the battle is won or lost. If you grow the ability to discern and coherently talk about what's useful, people will listen. You will find yourself a powerful contributor, one highly respected at meetings, the kind of person everyone likes and wants on their project, the kind management want more of.

If you can discern what's useful, you will be capable of self study. There is no other way to improve your skillset fast, cheaply, and in the precise direction you want. All the great minds of the past, once out of the nest of education, continued a life long path of self study that was core to their discoveries and achievements. Think of this training program as merely pointing a finger. The rest is up to you.


On Your Mark, Get Set, Go!

If you have strong affirmative answers to most of the above questions, and are capable of managing your own self improvement, we are ready to proceed. Remember, the higher your affirmatives to the above, the more successful your self-study will be.

Always ask yourself what you have learned from an assignment. The really sharp cookies will ask this before they even do it. Thus you can practice abstraction synthesis by identying what each assignment is trying to teach, plus learn more from the assignment. Always seek to maximize the value of your learning experiences.

We now present 11 progressively more difficult assignments. Don't follow this path exactly. Instead, intersperse or substitute additional assignments of your own creation to fit your goals.

These assignments are designed to jolt you out of old thought habits, and into a higher, more productive realm. They are not easy. But you're smart, right? :-)


1 - Your Self Improvement Program

If you are serious, your first assignment is to write down the following:

That was your first assignment. Its goals were to get you very focused and committed, help you develop a plan, and to start on developing the ability to organize and express thoughts well. Writing is much like modeling - We capture abstractions as sentences, paragraphs and themes. Good writing is more important than good modeling.


2 - Mini Process Critique

Examine the Mini Process. On a single page, describe its pros and cons, and suggested improvements. Go over this page and hone it until it reads well at a glance. Write short essays on:


3 - Your Engineering Skills Analysis

Print out the Software Engineering Skills. Use the two empty columns. Label one Myself and the other Model. Think of someone whose skills you admire and have observed closely (such as James Gosling :-) and let them serve as a model. Go through the entire list, rating yourself and the model with any method you choose. A 0 to 5 scale is common. If you like, have others rate you, and use that for the Myself column. Give this all plenty of time.

Summarize the results in a single page document titled "(Your Name)'s Skills Analysis". Organize it into Strengths, Weaknesses, and Planned Improvements. This last section should address how you will do these improvements. Stay at a high level to keep all this on one page.

Do the same thing a year from now and compare. The difference should be amazing.


4 - Abstractions

One skill is "Ability to grasp and create optimum abstractions". On a single page, list and describe the ten most important abstractions in the software field today. Validate it by applying it to ten good and bad companies, products or developers.


5 - Patterns

A key abstraction is Patterns. Study the "Design Patterns" book. Close it, and from memory compose a document naming and describing the 20 most important patterns in it, complete with a model for each. Give an example of where you have used or could use each pattern in your work. Include your personal definition of what patterns are and why they are so useful. This is a hard assignment that will take awhile but pay off bigtime.


6 - Pattern Use

The grandfather of all patterns is MVC. Using the Mini Process, do the requirements and design for a subsystem using that pattern and at least 3 others. Take the design all the way to all classes, methods and important algorithms. Show the design has been validated by how each Use Case, Trait and Risk has been addressed. Develop an Implementation Plan. Do all this so well you could now do it or hand it off with confidence.

Then implement it. There is nothing quite like seeing models go to code to understand what's really happening. Jack did this exercise 6 times, taking several weeks full time.


7 - Learning Specific Things & Reuse

Pick a small real or practice project that highlights one or more things you want to learn. Conduct it in such a manner that you can reuse as much of it as is appropriate elsewhere. Repeat this several times. Write a one pager summarizing the most important Principles of Reuse. Compose a Reuse Checklist. Present these to your group, improve the documents accordingly, and post them to your intranet.


8 - Best Practices

Study the Best Practices document, which is not current or complete. Compose your own document of what you strongly feel are the Key Best Practices for your type of work. Spend significant time on this, including research and interviews, and present it to your group. Record their feedback. Improve your document and add it to the company intranet. Prepare a one page summary of your Key Best Practices, discussing their strategic importance in your group and how they will be or are used.


9 - Second Iteration

Identify an important subsystem in your area that needs serious improvement. Apply the Mini Process up to and including the Implementation Plan. Do this so well people will see it as a masterpiece of engineering. Get feedback. Compose a one pager summarizing the key principles involved that will make the second iteration so much better than the first. Compose an extensive checklist for your type of work that will prevent future poor first iterations.

Then implement it. There will be some discovery. Revise other documents as necessary.


10 - Declarative Knowledge

The use of parameters, aka Declarative Knowledge or DK, yields very high reuse, lowers bug rates, speeds up projects, and gives organizations a whole new advantage. Write a one pager on what you see as the key abstractions here, and the important use considerations. Then do the Mini Process on an imaginary or real future subsystem using DK, up to and including Modeling. Then examine one or more systems using DK. Write an exhaustive critique on how they could exploit DK better, complete with specific suggestions. Present this to the group involved.

Then implement it. This should give you a deep understanding of what Jack feels is the single most important emerging abstraction in all of software. You should become able to see a problem in terms of reusable parts driven by DK in seconds. You should see systems as subsystems composed of Plugpoint Frameworks, where each plugpoint is a collection of DK driven parts. If you can achieve mastery of this abstraction, congratulations, and welcome to the top 1% of designers.


11 - Effects, Principles, Mechanisms

Study the Ultra High Reuse technology and EPM Anslysis. There is lots here, so give it some time. Munch on it awhile.

Now consider your group's area of expertise. Compose an EPM Identification document or diagram listing the most important effects you are trying to achieve, the main principles used to achieve each effect, and the main mechanisms to implement each principle. Next create an EPM Plan of where your group is today, where they need to go, and how you're going to do it. You may even get a brainstorm and want to use a phased grid. To improve its chance of success, involve everyone in this whole assignment. Learn how to excite people about improvement and get valuable input and buy in at the same time.


Next - Your Own Assignments

By now you've gotten the picture. Continue with your own self assigned "learning experiences" to achieve your own unique goals. Design each study effort to be high in payoff and as low in "off project" time investment as possible. It's possible to combine most of your self study with actual work. This is the art of leveraging your time wisely....


If you remember only one thing from this document, it should be: "Everyone's future depends on the ability to learn."

Isn't learning fun??? Good luck!