How do you think about programs?
lallysingh: I've tried a lot of systems (omni* and a few others), but here are what stick with me:Emacs Org-Mode for the day-to-day stuff that I want to keep in front of me when I'm writing code.  It's essentially perfect for it.  Using the tables with pasted-in code is utterly fantastic (hint: replace-regex '^' with '|> ' and it'll keep your indentation before you hit tab and tablify the code).Org mode does tables, outlines, todo lists, agendas, mostly everything a programmer's going to want day to day.For higher-level planning, I leave the workstation.  Get a cup of coffee/soda/juice/who-are-we-kidding-its-coffee and a table away from computers.  A moleskine (the squared one, with the grid layout) and a good pen (I like these $4 pilot extra-fine vballs) is what I use.  Relaxing music in noise-canceling headphones FTW.Do yourself a favor and begin with the habit of writing the date on a page when you start writing on it.  It's useful for you to see your progress over time, and it can be helpful later in patent disputes.As for the thinking process itself, here's my heuristic:- Small apps are mostly driven by a framework you just use (probably some MFC/DI garbage).  Keep your code clean & organized, and work a little to keep the expected chaos from working with always-mysterious frameworks contained.  E.g. don't ever trust the framework to handle your model code for you.  Use proxy classes, multiple inheritance, whatever to firewall yourself from that chaos.- Medium apps have enough internal structure to get past the cognitive mass of the framework.  There, you end up with a top-level abstraction that structures the app.  Be it a pipeline, a set of command objects, or a data structure you maintain, there's one big one and the app is structured by it.- Large apps have a few of these.  They're independent subsystems and you firewall their interactions the best you can.  Unless you've got the time/labor for large-scale refactoring, you generally just try to keep the abstractional dams from breaking.  In those cases, I usually try to get some middleware in there, so I can easily handle stubs, testing, and interactive use with each.  If you've got a REPL, you can avoid it, but in C++/Java, it can really help.