Software Development

Purpose
This project is a growing set of notes on various aspects of software development. Its purpose is to define a set of standard operating procedures for my programming projects.

Background
For most of my coding life, I have been the only user of my programs. I wrote them to aid my work or personal life, and only rarely did anyone else even see my code or watch it run. This wasn't on purpose. It just turned out that way. In my current job I do belong to a small development team, but our programs are still only for in-house use, so the only needs we have to consider are our own.

This situation is starting to change. My programming projects are becoming more relevant to the outside world, and I want to share some of them as open source. This means I'm needing to reshape some of my programming practices and learn some areas of software development I've had the luxury of ignoring all these years.

I haven't completely ignored these areas, though. I pick up on them here and there as I read about how other people code or as I see them in the software I use. Knowing that I'll probably need to know about them someday, I've kept a list. And now the time has come for me to fill in the details.

I'm filling in the details here in this project for two reasons. First, as I learn, writing helps me clarify my thoughts and keep them flowing. And second, posting my writing might help other people. So if you're like me and you've programmed mainly for yourself--what I call private coding--and you're starting to share your work with others--public coding--then maybe what I've learned so far can grease some of your own planning.

Method
This project consists of my reading other developers' advice, examining their code, deciding what to adopt and how to adapt it to my needs and preferences, and creating templates, procedures, reference materials, and anything else that might help me code well for a public user base.

To show how I'm implementing these ideas in my own code, I'll refer to my GitHub repositories throughout the project, mainly my templates for cookiecutter, a Python app that creates project skeletons for any language, and my snippets for Sublime Text 2, the text editor I use. Snippets are templates Sublime inserts wherever you type the corresponding trigger strings.

Limitations
To give you an idea of my background, I've worked for the past 15 or so years in the publishing industry doing mostly text processing and some web development. The languages I'm most familiar with are Perl, Python, XSLT, and some JavaScript, with a smattering of PHP and VBA. I've spent almost all my time in Windows. I hope to branch out into at least Linux in the future, if only to expand my mind.

This project will be oriented toward Python for now, but I imagine a lot of its suggestions apply to other languages too. At this point it also centers around desktop command-line programs, but I'm hoping to expand it into other interfaces and environments.

Feedback
Since this project is a place for me to learn, I welcome feedback, and I'm always open to arguments that my choices could be improved or suggestions for things I've missed.

Topics
As a way to organize my notes and make sure I don't miss anything important, I'll use the structure of IEEE's Guide to the Software Engineering Body of Knowledge (SWEBOK). It's a standard that overviews the entire field and forms the basis for creating things like curricula and certifications. You can download it for free as a PDF or read it online as HTML.

The items under the first level link to my notes on those topics.


 * Software requirements
 * Software design
 * Software construction
 * /Code Style/
 * /Project Structure/
 * /Installation/
 * /Metadata/
 * /Command Line Interface/
 * /Documentation/
 * /Comments/
 * /Literate Programming/
 * /Docstrings/
 * /Project Documentation/
 * /READMEs/
 * /Command Line Help/
 * /Application Configuration/
 * /Logging/
 * /Test-First Programming/
 * Software testing
 * /Testing/
 * Software maintenance
 * /Refactoring/
 * Software configuration management
 * /Version Control/
 * /Version Numbers/
 * /Distribution/
 * Software engineering management
 * Software engineering process
 * /Software Development Methodology/
 * /Iterative and Incremental Development/
 * Software engineering models and methods
 * Software quality
 * Software engineering professional practice
 * /License/
 * Software engineering economics
 * Computing foundations
 * Mathematical foundations
 * Engineering foundations

/Sources/
See the article linked in the heading for a list of code examples and other sources I'm drawing from.