# Habits of successful software developers Besides general [goal-setting](success-3_goals.md) and [productivity skills](success-4_routine.md), good coders require a variety of other "soft skills" to do well. ## Understanding Good coders don't just sit down and type out code without knowing what they're doing. They're trying to accomplish something with a variety of [computer-based tools](https://github.com/philosaccounting/toolbox) at their disposal. So, they will need to write out "pseudocode". Instead of fussing with syntax and variables, they instead get the "big picture" by making an outline of the code. Pseudocode has *hundreds* of forms. Like any [creative](mind-creativity-how.md)/[productivity](success-3_goals.md) system, you must make one that conforms to [how your brain works](mind-memory.md) and how you [understand](understanding.md) things. However, there are a few good ones that most programmers use: Flowcharts - A graphical representation of a function and how it might flow. - Each block represents a conditional statement or loop, with the resulting conditions represented as lines. Chronological Order - Write out each element, step by step in *excruciating* detail, of what the program will do. Functionality Planning - Write out each of the features the program should have, then examine all the functions necessary to make the program work. - This is a bit like the flowchart, but scaled out across the *entire* program. ## Optimization Since that person is in front a computer all day, practically every day, they will do everything they can to [optimize their routine](success-4_routine.md), even if it's eccentric: - Set the computer up higher to work while standing, or place it on a treadmill to permit walking while working. - Adopting an odd [keyboard](computers-keyboard.md) or [mouse](computers-mouse.md) that maximizes ergonomics. - Getting *extremely* high-resolution [computer screens](engineering-screen.md). - Disabling features in the operating system, or simply downgrading the entire operating system to a lower set of features (e.g., [command line](computers-cli.md)-based). - Using a less visually-appealing [IDE](computers-software-ide.md) that's more keyboard-based. ## Acceptance Persevering in programming is extremely hard because the perfect logic of computers breaks down in computer code. Computers and their code are so deeply complex and challenging, and a developer is *constantly* learning better techniques, that it's impossible to get anything absolutely perfect. For that reason, programmers have to accept they'll only get things that work well, but are never perfect. Later, they can [always optimize](computers-software-redesign.md), but getting an alpha out is the hardest challenge, and [version 1.0](computers-software-versionctrl.md) is typically a much more grandiose vision.