- Software design (diagramming and statement of expected program function)
- The C language
- Memory management--and memory leaks
- Trie data structures ("staged" directories)
- Developing a types system (tag value types)
- Using an issue tracker and public code repository (GitHub)
- Using software revision control (git--still learning :P)
- Software build process (Makefiles)
- Logging program execution with levels of verbosity
- User level file system operations on Linux
- Code generation (very ad-hoc and a pain to work with, but I am using it)
- Input parsing (query interface; doesn't follow the formal (tokenize-> parse) pattern, but it works)
- Vim-fu
- Data serialization and storage (the database file and proposed xattr data storage formats)
- Software testing (made some attempts at automation)
- Pacing
- Exercise regularly and eat right--you can't code effectively if you're tired and out of shape all the time
- Your code won't runaway overnight--turn off the laptop and get a full night's sleep
Regardless, I hope that this brief listing of my learning experience can encourage some others out there who, like me, have wanted to learn a skill independently but felt like making anything complex was too big of a challenge. The only barriers are motivation and knowledge; having a goal--and this is with anything, not just programming--will do wonders for directing your learning and motivating your actions. Find anything you want to do or make, set your goals and pay attention when you've achieved them. That's really all it takes.
~~~~