Programming toward profit by helping real people tackle their unique problems.
Guides endless progress toward products and profitable solutions that people actually use and appreciate.
This path can lead to unique market opportunities with interesting projects and people.
Creative development occurs primarily in the programmer, not the program.
Expect your greatest work toward the end of your career, rather than at the beginning.
What was the most difficult thing you ever made? Something so hard it took everything you had and then some. How deep did you have to dig to keep going when that unmistakable sense of creeping failure started pulsing in the back of your mind? Louder and louder with each new compromise, each concession a step back until you're on your knees grasping for breath. Has the crippling vision of your own limitations ever floored you? And when it did were you finally able to understand what your competitors must feel, the same forces at play, the same pressures.
At the bleeding edge, position and market share are less important and no matter how big a company gets in the final analysis it will all come down to one extraordinary effort that will push a product past all others. With each step toward the goal one notices fewer foot prints along the path as the intensity of real innovation increases. The sacrifices take a tole. Soon you stand alone but discover that's only half the battle.
Having caught your breath and licked your wounds, you may realize that your greatest competitor wasn't as great as she appeared. That you weren't as awesome as you thought and that your creation is flawed. Something is missing and you can't figure out what it is. All that time, all that money, and you've gotten nowhere. You aren't even sure there was ever somewhere to go. Is it a problem with the UI? Is it frame rate? Colours? Compatibility? or maybe it's just an unmarketable, confusing, offensive, invariably stupid idea...
But wait, years of experience has taught you much. At the time disconnected but now you see. That good software doesn't have to do a million things, it just has to do a few things very, very well. So what's missing is clear, as clear as the smile on your face. You forgot to sign your name on your product and stand behind it as you should have in the first place.
More Talking Points:
I want to talk about how important it is to put your own name on your work.
Fair credit is the natural process of genuinely earning respect, both external and internal.
Credit encourages a strong loyalty to ones creations with a sense of a responsibility for the consequences of the work.
Consistent growth in quality also allows an author to build her body of work in a way that gains momentum over time by leveraging past success toward future works.
Programming takes a long time anyway, even once you are good at it, so why rush into corporate employment.
Apprenticeship, entrepreneurship, and ultimately collaboration afford alternative paths toward greater personal success.
Yes the risks are much higher, the problems much harder and the money usually comes much slower.
Easy come, easy go though, as what you build stands the test of time while others fall to the wayside.
The financial limit of independence is limitless; the skills are real.
With proper practice ones abilities improve right along with new hardware releases affording options that most technologists fail to realize.
Profit comes from ownership, which comes from credit, which comes from creation, which comes from insight, inspiration, and hard work.
Your products are more yours the more you make of them, mod them, sell them, and support them.
Less reliance on prior works is the key to new works. Let the past inspire, not dictate or define.
Avoid cutting corners with engines you didn't have a hand in because it will inevitable choke your creative output.
Try to look at other software as "learn by example" opportunities.
Nothing is beyond your abilities if given time to learn and evolve.
Similarly, try not to rely too much on specialty hardware to tackle general problems.
Hiding behind gimmicks to circumnavigate performance limitations within price point may be fine for prototyping or selling to the cheap seats but don't short change your own best development. eg polygons and video cards.
Its strangely easy for programmers to become part of other programs they don't realize are at play.
Every piece of equipment or talent or policy or library etc must be considered as if they are program objects that effects the whole design.
Connecting control points with black boxes to "solve problems" in the cheapest possible way is only one of many to lose control of the development process.
Its no fun leveraging technology one doesn't like, just because some types of clients keep asking for it.
Choose your clients carefully, hold out if you have to, as long as you keep working on stuff you will find the right connection soon enough.
Instead learn to "feel" the limits of the universal principals as they challenge the practical limitations.
Rather than abandoning them to the current reality and accepting these limitations in perpetuity, compromise only as much as absolutely necessary and try again later as hardware improves or conditions otherwise change.
Nameless programming has led to a market place full of script colonies who don't care much about their work because not much of it is theirs and they wont make much with it anyway.
Recycled code leads to recycled ideas and recycled people.
Most were told what to do from the first project segment to the last project segment and other critical aspects of product development are routinely left to other non-programmer talent.
As soon as one starts programming anything sophisticated its discovered that the only practical way to make a complete program and maintain it as your own with affordable options on most platforms is a core language and the hollowed basics of computer science.
I prefer C, not C++, because it is so simple it essentially vanishes like arithmetic when I build something with it.
I imagine a master of C++ to be like a master of Calculus, wielding sophisticated complexity to produce many wonderful things in very specific circumstances.
A master of C is like a master of Algebra, this kind of master produces the foundation on which all other maths much rest their arguments and so is useful everywhere and as a core part of any other system.
If a master programmer wants to program from beginning to end, C is a very powerful "Turing" compatible choice.
Like algebra, C works everywhere with minor platform specific modification.
It's as easy to understand as algebra and as such takes years of practice to master.
Exploit specific hardware capabilities, maintaining that performance edge that made C so wonderful in the first place.
Stable and reliable, the code sets are smaller and more freely manageable even for large products.
It's minimalism allows a programmer to focus the bulk of her attention on the creative elements involved in the product itself.
It's not about specific language though, let's be clear, it has always been about the programmer and her ability to manifest her vision.
C is only useful in so far as it gives good results.
Avoid peeling back the universality of low level languages with device specific environments or data structure dependent languages when writing the core source.
Instead use higher level languages for what they're good for, making ports of an original product for the companies that make or endorse mainstream platforms and languages eg, Apple/iPhone, Google/Android, MS/Windows.
Write your own tools, cloud, PC, mobile, etc or all of them.
If you're a programmer and you're running a technology company you need to be using as much of your own technology as possible for all the same reasons as writing as much of your own program as possible.
Because you are in this business, you must try to understand all that you can, you must know infinitely more about your craft than your customer.
Consider the following truism: a fine dining experience is rarely produced by a kitchen that orders pizza from across the street.
To produce high quality you must set up your operation with high quality in mind.
It is a myth that one can practice for years at something unsatisfying to make big money to position for better more personally satisfying stuff later.
With every key stroke a programmer is programming themselves so what and how you program matters a great deal.
One must be working toward the ultimate goal every day, and even money projects have to be leveraged on terms that serve that ultimate goal.
Though difficult this means saying no to some jobs and some "apparently easy money" projects.
Endure the risk and pay the dues and the product of your ever growing skill and legacy will sell your services as you are distinguished from your competitors.
Create your own standard and make the world notice it through these means.
A long list of happy customers will back you up and perhaps at some point a few programs with your own name will be available in stores everywhere.
Design for real people, stand behind your work, practice the core principals of programming and always try to do better. Do this and you will find your place among the chosen in Valhalla.