Passion vs. Profit
My first programming experience was in 1985 on an old TRS-80 color computer that was sitting unused in one of my high school classrooms. I had a lot of free time in that class so I decided to pick up the manual and start learning.
I knew right away that I’d found something special because my brain wouldn’t let go of it. Even away from the computer and after school, I kept thinking of different things I could try with the BASIC language and its commands. When I’d see other subjects in some of my classes or in real life, I thought about how I could turn them into code with the very limited programming knowledge I had at the time. This happy little obsession continued in college where I spent hours after school on my own independent projects.
It was several years before I actually did any programming for money but that early enthusiasm guaranteed that I would eventually find a way. I still believe that lasting software careers start with a love of software creation and a desire to explore the possibilities rather than a desire for a paycheck. If you’re going to spend your days hacking away at programming languages, trying to coax the necessary behavior from the CPU and accepting all that comes with it, including ridiculous project timelines, inadequate specifications and all the politics and nonsense that go with any career, there better be something about it that you truly love or else you will be miserable.
No salary or benefits package on its own will be worth it otherwise; trust me. I’ve had people tell me that I’m not really working because programming is something I do for fun but I remind them that companies and clients are very adept at turning that activity into work.
Beyond enduring the inevitable downsides of a career, a love for the work affects the level of craftsmanship and that word applies as much to software as it does to furniture or cars. People will naturally tend to excel at work that brings them happiness; the innovation and attention to detail will be there. Some of the best programmers I’ve worked with and learned from did not have college degrees or at least did not go to school for programming. When one of my mentors was asked how he learned so much about programming, he said “I just f*** around with things.”
While companies like to list degree requirements in their job listings, often for salaries that don’t justify those qualifications, programmers are still fortunate to be able to find work without a degree if they have the initiative to self-train and promote their skills. Bootcamps are also a well-known option but they tend to be very expensive and are not a substitute for the enthusiasm that will enable someone to use and maintain those new programming skills after the class time is over. Ultimately, it’s up to the individual to build their own portfolio of skills that will sustain them through technology changes and job transitions. That’s another aspect of the career that’s more likely to happen if there’s a passion for the work.
Unfortunately, as programming jobs have become associated with six-figure salaries in the U.S., that idea can get lost in the gold rush of students wanting a quick path to those salaries. The idea of developing personal projects, even small ones, is sometimes dismissed by new programmers who would rather just do interview prep and grind Leetcode to help them pass the job interview and get on board.
I even fell into a similar trap when I was teaching a college class in programming and promoting it to future students. At that time, the easiest 10-minute message to present to a group of bored high schoolers was about the earning potential of a career in software development, so as to at least hook their interest. I’m happy to say that the class itself was an intense workshop experience with multiple projects that the students had to complete to develop their skills. Unfortunately, that also contributed to a high washout rate which didn’t please the vocational career school whose business model depended on maintaining admission, graduation and placement numbers.
I don’t know that there’s a solution to the commoditization of programming jobs and the focus on profit before professional excellence. If such classic professions as medicine and law couldn’t escape that trend, then such a young profession as software development in which so much money is involved can’t be immune to it. I can only trust that the sheer availability of free programming knowledge and materials will continue to draw in new enthusiasts who pursue it for the excitement of seeing the logic come together and that some of them will realize, as one of my students did, that code can be beautiful.
I do know that if I was trying to recruit more students and help them appreciate the profession, I wouldn’t even mention the salaries involved. Instead, I would help them experience the same shift in perspective that I did when I first learned to code.
Computer programming could be viewed as a form of education as well as engineering; the programmer is teaching the computer to perform specific tasks. The computer has no actual intelligence, only the ability to instantly respond to any programming language that can be installed on it. It’s up to the programmer to learn and use a language well enough to provide the best instructions to the computer. The more talent and experience the programmer has in communicating with the machine, the better results they will get.
The obstacle that comes before that is the developer’s own understanding of the process and their ability to break that process down into steps and terms that can be communicated. It’s really the same basic challenge that anyone faces when they try to instruct someone else.
For a first programming challenge, I ask you to consider how you would teach the computer to simulate a tree. Imagine that you are responsible for creating a hyper-realistic simulation of this tree that duplicates its behavior and lifespan as closely as possible.
Programming is actually a misleading term here because I’m going to tell you to forget about the code for now. Don’t worry about what language you will use; we’re not anywhere near there yet.
Forget about the way the tree looks, too; the computer can’t see it and wouldn’t know what to do with the image if it could. When I say simulation, I’m not talking about graphics or animation on a screen because that’s only an outward perception, anyway. This simulation will focus on the tree’s function and measurable effects on its surroundings. Once that’s in place, any type of graphics can be used to represent it.
What the computer needs is your understanding of the tree itself. In reality, the tree is an immensely complex system with processes that happen down to the microscopic level. The more of these fine details you are able to understand and communicate to the computer, the more accurate the simulation will be.
Just like software might need user input or a connection to the Internet, this tree has inputs and dependencies including sunlight and soil nutrients. It has resulting outputs such as oxygen and the leaves that it might return to the environment every year, depending on its type.
Just like software, the tree has users that depend on its presence and those users have specific requirements of the tree just as business users require specific operations from a software system. Users from birds to moss might depend on the tree for food or shelter. Humans and animals might harvest its fruit. In this case, if the tree is unable to meet those requirements, the users will move on like clients who are no longer satisfied with a product.
A computer program is often made up of specific functions and routines that run in sequence, on schedule or in response to user actions. The tree has functions like photosynthesis where it continuously processes the CO2, water and sunlight to sustain itself and release oxygen. Again, these functions depend on chemical reactions that happen on the microscopic level. In your simulation, you could choose to approximate the rates of input and output based on observation of actual trees and the known science but the more fine details you give the program, the more accurate the simulation will be. The more information it has on the biology of the tree and its chemical interactions, the more likely it will be to go beyond the current understanding and actually suggest new possibilities about the nature of the tree itself.
As one more example, software often has events in which it responds to certain conditions by notifying other parts of the program or even outside programs and possibly making information available. The code that receives these notifications is sometimes called a subscriber. The lifecycle of the tree also has a number of events that could be coded from the germination of a seed to the sprouting of leaves and production of fruit or flowers that give off scent which then notifies other life within the greater system that the tree inhabits. Even the death of the tree is an event that has effects on the surrounding environment and this would need to be taken into account within the simulation.
Software has requirements that must be established before programming can begin and that means asking the right questions, sometimes repeatedly. For the tree and its simulation, there’s also a list of requirements.
- How much sunlight and water does the tree require? What the best climate for its growth?
- Should the leaves change color with the seasons?
- Does the tree produce any chemicals or other defenses against pests?
- How resilient should the tree be to a change in climate or to pollutants within the soil?
Trees, like software programs, often have to interact with each other and other parts of the larger system. This means more questions.
- Can the tree compensate for lower light levels caused by crowding by other trees?
- Does the tree spread its seeds on the wind or are they activated by a forest fire or spread by animals?
- If a tree succumbs to disease, is that a design issue or a necessary interaction? How likely are different specimens of the tree to resist the disease and reproduce?
Software development requires understanding systems both large and small. Whether you’re working for a company or a client, you need to understand the customer’s requirements and needs and account for the realities of the environment where the software will run. Successful software adapts to the needs of the users and environment, not the other way around.
To understand a process well enough to explain it to another is to educate yourself. Once you ask enough questions to gain that understanding, you’ll never see that process the same again. Your perspective is forever changed because you have learned to understand it well enough to recreate some part of it, if only in someone else’s mind or the computer’s memory. You take that new perspective with you from every project.
I guarantee, the next time you look at a tree, you’ll see something new.
If you’re still wondering about the code itself, I’ll give you a hint. Trees, like humans, have chromosomes and genes that determine traits. This can be considered an example of design architecture, the structure that determines how information and instructions are stored and made available. Of course, with architecture, opinions differ as to what type works best and software developers are as opinionated as anyone else.