Requirements and Product Planning

I found a college paper of mine on Requirements and Product Planning, so I figured I’d publish it online. You can view it on Scribd here or embedded at the bottom. Here’s a full outline (lightly edited) that I wrote before writing the paper:

Requirements and Product Planning Outline

Short product design plans combined with prototypes and diagrams are usually more effective means for finding and communicating the plan of a product than detailed written requirements. 

  • Finding and communicating the right requirements are the most important part of a project. It is therefore crucial to find the right approach.
  • The earlier you mess up, the worse is it is. The early decisions decide the direction of everything. So if you make wrong choice and only discover later, you will have to throw away a large amount of work. Studies showing how crucial the requirements stage is.
  • Definition of requirement – what the product must do to solve a user’s need.
    A full requirement answers these questions (Motorola):

    • Who it is for (E.g. The world, doctors, 54-year olds)
    • What it will do (E.g. Actions, results..)
    • Describe the full user experience and accurately represent the behavior of the software
    • Additional questions – Where, When and How well.
  • The purpose of requirements:
    • To accurately describe user experience and software behavior so all parties can understand it.
      • The requirements should be able to be communicated to customers, engineers, marketing and any other parties so they all know what the product will be.
    • To aid in finding the right product and refine until satisfactory
      • Sometimes will want to adjust the product, so need to specify first and then refine the requirements before building the actual product.
  • Ways to find ideas and determine the requirements
    • Market research tools and their limitations
      • Customer surveys and interviews
      • Analytics, data mining and social analysis
      • Site visits and focus groups
      • Usability testing.
      • Competitive analysis

This research may help gather data, but it will not determine what features or product to build. To determine what to build need to go beyond that.

  • Ideas and testing them with users
    • Need to determine how technology will be used to solve certain problems and what the user experience will be.
    • To do this, need to recognize the problem and understand what potential technology can be used to solve it.
    • This is how practically all successful tech companies built their products, not with market research. For example:
      • The Google founders invented a new algorithm to ranks search results which made them more relevant and higher-quality than what existed before.
      • Facebook developed a successful social network by figuring out what people would want most long-term in such a site. For example, they placed certain restrictions on users (like a real-name policy or set profile page) that helped them become successful.

They didn’t use market research, they were able to figure out what people would want and how to do it with technology.

  • Ideas are nice, but need to verify if they will work, since gain nothing from products that people do not want (at least in capitalist countries!)

As mentioned above, a primary purpose of requirements is to be able to refine product early in game to avoid large costs later.

  • Approaches to formulating and communicating requirements:
    • Full, formal text requirements (Motorola book)
      • This used to be the standard corporate practice in big companies.
      • These formal requirements are similar to an engineering process of e.g. a bridge or building.
      • In full, it can include five steps of engineering:
        • Elicitation – Discover requirements by consulting stakeholders.
        • Analysis and Negotiation – checks if requirements meet certain criteria, such as consistency, completeness and feasibility.
        • Documentation – for communicating them.
        • Validation – Check if it describes the system well and if there are problems.
        • Management – Manage the requirements. To track and develop complex requirements, can use a Database Requirements Management Tool, which provides various benefits. (Motorola)
    • Full prototype (Inspired book)
      • Create a throwaway prototype (using tools that make it fast) to show the various activities that will be possible. Parts that cannot be built into prototype should be simulated.
        • “Realistic representation of the proposed user experience”
        • Comprehensive coverage of the site – Prototype “should represent the functional requirements, the information architecture, the interaction design, and the visual design of the user experience.”
      • Another possibility is to use an evolutionary approach. Develop a very simple version of the site and then use that as basis for the actual site. However, if the foundations of the site are not well-designed, the site will always have problems.
    • Proposed middle approach
      • Short product design description, combined with wireframe/prototype to show overall idea and diagrams or visual representations (such as UML). Instead of full text requirements, can just use “Use Cases”.
  • Comparing the effectiveness of different approaches:
    • For discovering the right features and product, and testing them
    • For communicating to relevant parties (so they know what to do)
  • Each approach analyzed:
    • Full text requirements
      • Pros – Everything is spelled out. People should know what specifically needs to be done and when meet the criteria.
        Sometimes it is necessary to have very specific requirements – for example, if very specific critical criteria need to be met, such as software for a bank or nuclear plant.
      • Cons – Takes time to create, complex, but may be difficult to understand. Cannot test with users.
        The fundamental issue with full requirements is that they assume “It is possible to determine a stable set of requirements before system design and implementation starts.” With many web products nowadays, that is not exactly true.
    • Full prototype
      • Pros – Clearly shows how it works and this can be used to communicate well with all parties. Can also test product on actual users before building the real thing.
      • Cons – Can take a while to make and is redundant with later efforts. Additional problem is if it does too many details such as the UI, it will be describing “How” to do it before the “What” that requirements are supposed to be focused on.
    • Proposed best way – Compromise, but focused on the lean way – Minimum prototype, minimum product design plan (focused on use cases), clear diagrams, etc. to show all aspects of product.
      • Pros – Can efficiently create it, it can communicate effectively, can help find the right ideas, more flexible, allows for some testing before create product.
      • Why this approach is better than long detailed text requirements:
        • This approach fits better in web age as opposed to box shipped stuff. Since can iterate and develop new features quickly, do not have time for long requirement process.
        • Use cases and prototypes (and software tests) combined can meet the needs of requirements. The use cases describe the overall needs and the prototype can show the different parties what the product will do to meet them. Additional details can be shown with basic charts, but extensive detail is not necessary.
        • Outlines and visual charts are better since they communicate the ideas more quicker than long text. They can also be made more quickly, since one does not need to “textualize” the ideas by turning them into paragraphs.
      • However, this approach has some of the cons of each approach above, so need to find right balance. For example, can make sure prototype is built quickly with a focus on just communicating what the product will do.
  • While standard practice may have been to follow more formal and longer requirements system, this is becoming less common. Part of the reason for this is the overall differences between agile and traditional development methods:
    • Agile methods are adaptive rather than predictive.
    • Agile methods are people-oriented rather than process-oriented.

As mentioned, this is partially due to changing nature of web products where everything must move much faster. There is much less reason to use a complex formal process for developing products (especially consumer ones) on the web. Some companies may be used to older methods, or they may be developing products where it is important to get everything right. But this approach is no longer needed for most consumer software products.

Learneroo on Kickstarter!

While there are online tutorials for learning other programming languages, there isn’t much for Java. I decided to do something about this and began creating some Java content on Learneroo. To fund the continued development of the site, I created a Kickstarter Project. Please check it out!

kickstarter.com/projects/arikrak/learn-java-programming-and-more-by-solving-challen

The Automated Store – Chart

In previous posts, I wrote about the creation of an automated store machine in the 1900′s. In the chart below, I have jumped ahead to when the actual machine is first installed. I think this chart can help people get an overview of certain concepts by seeing them in physical form.  I created the rough sketch below with a pencil, but when I get better drawing software I will be able to create a digital version, which will be updated with color and more.

The Web Framework from a Century Ago

Machine Overview
While initially the main purpose of the machine was so the store owner could track inventory, many new features were added. This picture focuses on customers who which to view the inventory/catalog information themselves.
The customers enter their information by punching holes into a “HTTP” card they are viewing. This card then goes into the Router which cuts it up and sends it to the appropriate controller. For example, if a user asked to views product #43, the router will pass “43″ to the Product Controller’s viewing arm.
The controller will then send this information to the Active Record Player, which will send back the relevant data, as seen in the previous post. In this case, it would send back a copy of product card #43. The controller’s Action View will then take over and combine the data with the relevant templates to create a page. This will involve cutting up the data-card and inserting the information into the correct location on the “view product” catalog page. The page will then be combined with some general headers and some styling layers from the assets box, and then the whole thing will be pressed into a single page and sent back to the customer.

The Automated Store – Accessing Data

This is part two in a series about a mad engineer and the machine-framework he created in the early 1900′s. Any resemblance to modern frameworks, living or dead, is purely coincidental. 

In the first post of this series, the store owner, Jim Blackford, outlined the basic requirement he would need for Version 1 of the Automated Store Machine. We’ll quickly review his requirements:

Blackford: Well, I want to keep track of my inventory. So I guess it should let me create inventory records and store them well. The I should be able to access them at any time to read them, update them, or delete them. And it should keep track of how much inventory I have, and let me modify that when I get a new delivery or sell an item.

Dr. Hanson: Crud, that’s a lot of work. But me and my assistant can get started on building that machine. We’ll keep you posted on our progress…

Part II - In The Hanson Basement.
Dr. Hanson discusses his plans with his assistant, Dave Kemp. 

Dave: What up doc?

Hanson: We have a new project. I met with Mr. Blackford, and he needs a machine to track his inventory.

Dave: An inventory machine? How will that help you achieve world domination?

Hanson: This machine will not just be focused on tracking inventory. For Mr. Blackford’s own sake, we will need to make it extendible so we can add new components to help with his store. But my plan for this machine is greater than that. Once we complete this machine, we will look at the principles of its design and use them to build other machines for all sorts of purposes. Ba-Ha-Ha!

David: How will you do that?

Hanson: We will need to work out the details. But we will use solid engineering patterns that will then be able to used when building other machines. After all, what is the purpose of any calculating tabulating machine? It needs to store and retrieve data in an easy fashion, and perform simple operations on the data. Once we have the right design worked out, everyone will want our machine! They will no longer need to have their own Personal Hodgepodge of Pasta built from scratch, they will be able to start out with solid architecture.

Construction Begins – Accessing data (rough version)

rails-toon-1

The Automated Store – The Plan

This is a the first post in a story about a mad engineer and the machine-framework he created in the early 1900′s. Any resemblance to modern frameworks, living or dead, is purely coincidental. 

Dr. Victor Hanson was a brilliant mathematician and engineer, though a tad crazy. He had invented a machine that could perform various calculations, but it had not sold well, and anyways he wanted to create something more ambitious. He decided to take out an ad in a newspaper to see if anyone needed his services:

newspaper-ad

Jim Blackford had been running his store without too much problems for some time, but he was getting a bit bored dealing with the same tasks every day.  He wished he had some way to automate some of these processes. One day, when reading the paper, he noted an interesting ad…

A week later, in a restaurant in New York:

Blackford: Dr. Hanson, I presume?

Hanson: Yes, nice to meet you. I can now tell you about my automated machine services. I built machines that can calculate and tabulate numbers, but I’m thinking of branching out into other areas. What kind of machine do you need?

Blackford: I’m tired of dealing with the same manual tasks while running my store. It would be nice if a machine could just take over various operations for me. Though I’m not sure how that would be possible considering our pre-digital age and all.

Hanson: Nothing to worry about, I cans create analogue machines.  Now what specific requirements do you need in your machine?

Blackford: Well it would be nice if I could receive some automated help  to keep track of all inventory, process transactions, display brochures to customers, and maybe hand them products from higher shelves too.

Hanson: Wo, not so fast! Let’s focus on the most essential features you need first and later we can iterate on that. What is the most basic important thing you are looking for when shopping for automated store-running machines?

Blackford: I guess some way to keep track of all my inventory.

Hanson: OK, so let’s focus on that. What exactly do you want the machine to do?

Blackford: Well, I want to keep track of my inventory. So I guess it should let me create inventory records and store them well. The I should be able to access them at any time to read them, update them, or delete them. And it should keep track of how much inventory I have, and let me modify that when I get a new delivery or sell an item.

Hanson: Crud, that’s a lot of work. But me and my assistant can get started on building that machine. We’ll keep you posted on our progress…

Stay tuned for the next post where Dr. Hanson builds a first version of his machine. You can follow me on Twitter or RSS

A Map of Resources for Learning Ruby

My previous chart of resources to learn programming was well-received, but some people suggested additional resources. I decided I would try a new format to display more resources for learning programming. It is a map of different resources, which are ordered from left to right based on experience. You can choose a resource from each vertical, and then move to the right as you gain experience. A sample path is shown in the image. It would be interesting to see how these kind of charts can be improved to quickly display relevant information about each item. Click on the image below get a clickable image map, an SVG should be coming soon.

Map of ruby resources

The Zappable Guide to Finding a Web Host

I decided to update the Zappable Guide to Finding a Web Host. This guide is intended for a newbie who is would like to find out about different hosting options, though I think others can find helpful stuff here too. Most people just Google for information and get results based on SEO instead of what’s most helpful. While Google’s results have improved, you still won’t get a helpful review of the many different options possible. In the chart, I try to explore many different free options, and a couple of paid options too. (Note: I made some of the links into affiliate ones.)

The basic categories I explore are Static Hosting, Cloud Hosting, Cpanel hosting and regular dynamic hosting. I provide recommendations for in each category that I think are good and reliable. This chart should help people quickly find a good web host choice. If you want some more background info and specific details, see finding a web host. The chart is embedded below and a PDF is available here.

Updates:
I created a webpage version of this chart, which will be able to contain more info and be updated more frequently. For example, see the Dreamhost coupons.

Chart for Learning a Programming Language

Note: An updated version of this chart is now available on Learneroo.com.

The previous chart helped beginners pick a language, this one shows them what resources to use to learn it. It’s better to spend time doing things than to passively read or watch content, so I selected interactive websites, books and courses. Start by going through an online tutorial, and then either read through some of a book or watch an online course. Personally I think a book is better than a video since they’re more concise and easier to reference, but most videos below are short and to the point. The chart is based on these posts: Picking a LanguageGeneral TipsJava and PythonWeb: HTML Javascript and PHPLearning Ruby and Rails

Free Resources For Learning a Programming Language

Java Python Ruby Javascript
Good For Kids / Game Programming Greenfoot Invent Your Own Computer Games  Hackety-Hack, Games: Ruby4Kids CodeAvengers
Interactive Tutorial – Codecademy? No, You can try Programr Yes Yes, there’s also
TryRuby
Yes
More Practice and Help CodingBat Problems Visualize Python executing
(also CodingBat)
RubyMonk*
(1st part is free)
Use Firebug or Developer Tools.
(See Waterbear for visual coding)
Good Free Book for Teaching Programming How to Think Like a Computer Scientist How to Think Like a Computer Scientist Learn to Program
Humble Little Ruby Book
Eloquent Javascript
Interactive Video Course Intro to CompSci -
Programming methodology
(Warning: full Stanford course)
Udacity – Intro to CompSci – Building a Search Engine CodeSchool’s RubyBits* .AppendTo Javascript 101
Advanced Book Effective Java* Dive Into Python 3 Pickaxe Guide* JavaScript: The Definitive Guide*
More Training / Bootcamps See Local / Online colleges See online courses or corporate PythonTraining Most Bootcamps are for Ruby on Rails Catalyst.
For kids: CodeHS.com
* Not free. Update: added affiliate code to Amazon links.

Picking a Programming Language – Chart

Note: An updated version of this chart is available on Learneroo – Programming.

Now that I finished the series on programming, I figured I would make some charts for it. This flowchart will help people pick a language. Click below to enlarge, or view it on Scribd. For more info, see the original post.

Update: After you pick a language, you might want to know how to learn it or how to find a web host.

Learning Ruby and Rails

Note: This post on Ruby and Rails is the final one in a series on Learning How to Program. Previous posts were: Picking a Language, General Tips, Java and Python, and Web: HTML, Javascript, PHP

Say you don’t want to edit old PHP scripts, but instead want to create your own new web application. A good choice would be Ruby on Rails, the ‘cool’ framework for creating websites. It contains various tools and elements that are common to most web applications so you do not need to re-create them from scratch in your own website.   For example, most web apps have forms that take user data and place them in a database. Ruby on Rails lets you create such forms quickly and securely. Rails is written in Ruby, so to code with Rails, you will need to know some Ruby. While you don’t actually have to spend that much time coding with Ruby before starting Rails, I think it makes more sense for a beginner to get comfortable with programming basics before taking on a complex web framework.

Ruby
As always, it’s good to jump right in with an interactive tutorial, which there is no lack of in Ruby. You can spend a few minutes on TryRuby and then look at Codecademy or go through slightly more advanced material on RubyMonk, which has 1 free course and additional courses for $10/month. If you like videos, you can pay $25/month and get access to CodeSchool’s courses, including RubyBits.

You should have a book also though. Learn to Program is geared at teaching programming concepts to beginners, and they aso have a more recent paid edition. The Humble Little Ruby Book is good for learning Ruby, though if you prefer more attitude and random cartoons, there’s the famous Why’s Poigant Guide to Ruby. If you have more experience and really want to get experienced at Ruby, there’s the Pickaxe Guide.

If you want to download something to teach kids Ruby, there’s Hackety-Hack, and if they’re just interested in games, there’s Ruby4Kids.

Ruby on Rails
After learning the basics of programming and Ruby, you can start learning Rails, which also has interactive tutorials. CodeLearn recently launched to let people learn Rails by trying out things from within their browser. If you like learning by watching zombie videos, check out CodeScool’s famous RailsForZombies. You can then signup to CodeSchool and get access to the sequel.

The ‘official’ free text to learn Rails is the Ruby on Rails Tutorial, which goes through all the details on how you would create a Twitter-clone, from getting things installed to version control, from “rails-flavored” ruby to nice CSS styles, and of course, all the fundamentals of Ruby on Rails.
The book places a strong strong emphasis on writing test code, which is code that tests out your main code to ensure it does what you want it to. It follows the TDD and BDD processes, which means you write the tests before you write your actual program’s code. Sometimes you will spend more time writing the tests than actually writing the rails code, but this way you will know your software always works. You can always skips some of the test-parts if you feel its too much.
The issue with a step-by-step tutorial book is that you need to make sure you think about how to do things, and not just copy what the book says. It might be helpful to try to figure out what to do before looking at the code in the book, though that won’t always be possible.

If you have a little experience, you might like Agile Web Development with Rails, which goes through how to create a shopping-cart application in part 1, and contains a rails reference in part 2. To learn how to do specific things, you can watch the screencasts on Railscasts. There’s also the official Rails Guides, which cover various aspects of Rails.

Of course, to actually learn Rails or programming well, you need to work on your own projects. As mentioned, you should find someone to help you work through a project. If you have a couple months, you could consider signing up at one of the Rails bootcamps that sprung up recently. Devbootcamp pioneered the bootcamp approach in SF, AppAcademy  claims they’ll only charge you if you get a job, Starter League is well-established in Chicago and Flatiron School recently started in NY. They charge $8k – 12k, but many give partial refunds if you take a job with one of the companies they’re connected with.

With all these resources, it’s easy to try out programing and then pursue it further if you like it.

Creating Websites – Programming Required

In a previous series, I discussed how you can build websites – no programming required. While you don’t need to program to setup  you’re own blog or wiki, you will need to program if you want to create or customize things beyond what your software has options for. In recent posts, I gave some tips for getting started with programming, and linked to some resources on Java and Python. This post will focus on the web languages – HTML, Javascript & PHP, and the final post will be on Ruby.

Before learning actual programming languages  you’ll want to get familiar with the basics of the web. Web pages are structured with HTML and styled with CSS, so you should quickly learn how they work. If you were editing pages before using a WYSIWYG tool like Expression Web, its time to start editing the actual HTML and CSS code. You can either do this in a simple program like Notepad++, or within Expression Web from the “code” view so you can still use some of its tools. To start learning HTML, you can go through a tutorial, such as one of the resources here from Mozilla. W3Schools often comes up on Google searches, and they have some useful interactive resources, but beware that they may contain a few inaccuracies. To get an idea of how HTML and CSS is used, you can view the source of any webpage you visit by clicking on “view source” in your browser. You can also play around with the HTML and CSS from within the Chrome developer tools or with Firebug on Firefox. This will let see how many different websites use CSS styles.

HTML on modern websites are not created by hand or by an HTML editor, but by web applications, such as a CMS. Web apps are written in programming languages, such as PHP or Ruby. As discussed, many web apps are written in PHP. So if you want to develop new components for your WordPress blog or wiki, you need to learn PHP.  W3schools has a fair amount of info on PHP, and I don’t think it has too many errors. WebMonkey looks like it has a good tutorial for beginners.  There aren’t many new interactive tutorials on PHP, but there are many books you can purchase.

If you’re more interested in front-end development (such as visual effects on a page), you need to learn Javascript. Unlike PHP, it is growing in popularity, so there are a ton of resources online to learn Javascript. Previously-mentioned Codecademy created their first tutorial for Javascript, and they have many courses on the topic. They have a bunch of competitors now, such as CodeAvengers, which seems geared at kids. Its good to go through a book too, and Eloquent Javascript is a great interactive resource. The key is to not just read, but to practice and build things, which is easy to quickly do in Javascript. Firebug and Chrome’s developer tools have great features for trying out your own javascript and exploring other website’s scripts also. After you know the basics of Javascript, you will be able to not only customize web pages, but also create other things like Chrome extensions. In fact, Javascript can now even be used to run the server-side of a website with Node.js (though its not for beginners). This means that you could conceivably create entire websites with javascript only. If you really want to learn Javascript well, you could consider attending Catalyst which is a new bootcamp that opened to train beginners.

Stay tuned for the next post on Ruby and Ruby and Rails, the most popular modern framework for creating websites.

Learning How to Program with Python or Java

In the last post, I discussed some steps for learning to program, and ended with a few general resources. This post will provide some specific links and free books for learning programming with either Java and Python, and the next post will go into web development languages.

Python
As discussed, Python is a great language to learn programming with, and there are tons of learning resources online. A good path would be to start with a simple tutorial and problems, and then go through a more advanced resource that teaches fundamentals of programming.
Codecademy recently expanded to offer Python tutorials, and they have a well-designed site that’s good for beginners. There are many other places you can practice problems, such as CodingBat or PythonChallenge. To get a better understanding of what the code does, you can visualize your Python executing.
To learn computer science fundamentals, How to Think Like a Computer Scientist is a great interactive book to go through. After you get through that (or if you already have programming experience), you’ll want to look at Dive Into Python 3. If you want a video course, Udacity offers short videos combined with coding problems. You can start by building a search engine in Introduction to Computer Science, and then move on to either Algorithms or Web Development.
Also, If you know a kid who wants to create computer games, Invent Your Own Computer Games is a free eBook on the topic (see also the PyGame modules.)

Java
There aren’t as many free Java resources, but there’s enough to get started. There’s a Java version of How to Think Like a Computer Scientist available online. There’s also a free version of Thinking in Java, though you may want to buy the most recent version instead. If you like lots of pictures and attitude, Head First Java is a good book. Once you have more experience, the recommended Java book is Effective Java. You can also go through the official Java tutorials.

Since Java is a different kind of language than Python, there aren’t as many interactive resources online. To practice problems, you can go through CodingBat and some stuff on Programr. However, to benefit fully from Java’s “safe” features, you will want to do most of your programming in an IDE. I used to recommend against using a beginner IDE like BlueJ, since it lacks features that are also useful for beginners. However, their IDE has improved so that it contains most beginner-friendly features, such as built-in documentation. A good IDE to use later is IntelliJ, and Google recently came out with a version of it for Android. However, if you know a kid who wants to learn programming, it might be worth checking out the Graphics-focused IDE, Greenfoot.

Android
Since app-development is very popular, I’ll briefly discuss it here. Due to Android’s complexity, you shouldn’t try developing apps before you’re comfortable with Java. One you’re ready, Google provides a fair amount of training resources. You can also buy a book like Programming Android. If you’re impatient to start creating apps, you can use the visual programming tool AppInventor, which should help teach some programming concepts.

 

Learning How to Program – General Path

In the last post I discussed picking a programming language; this post will discuss a a general plan for learning programming. The next post should link to some language-specific resources.

Basics - The first step is probably to find a good online tutorial that teaches the basics. I don’t think long video lectures are a good way to learn programming, since one needs to focus on doing things, and they are also hard to refer back to. Instead, one should find a good interactive tutorial that lets you practice as you go through it. You should practice with small additional problems on your own, either ones you make up or problems you find online.

Reference – Make sure you know where to lookup stuff. You don’t want to immediately do a general Google search for every question. Each language has official documentation that you should be able to search quickly to find out how to use something. It might also be helpful to have a specific book or site you check to get more info. It can also help to keep your own code samples organized so you can quickly refer back to previous work you’ve done.

StackOverflow – StackOverflow.com is a free Q&A site for programming. Once you know your programming basics, if you have a question on how to do something, you can search StackOverflow to see if its been asked. (Often it’s easier to search StackOverflow through a Google site search.) If you can’t find an answer, you can ask the question yourself on StackOverflow, but make sure you spell out the specific issue your’re having. Well-written questions on popular languages often receive very fast answers on StackOverflow.

Bigger Projects – After you’ve gone through the basics and worked on small coding problems, you’ll be ready to take on a bigger project. You should now pick a project that you really want to work on, and learn more as you work on building it. When you get stuck, searching the web (and StackOverflow) will sometimes help you figure things out. However, it helps to have a more experienced programmer to turn to when you’re really stuck or for general feedback and guidance. You can either find someone you know, hire a mentor, attend meetups, or even enroll in a programming bootcamp.

Stuff To Learn - Besides learning the specifics of your language, you should also learn the general basics of programming. This includes topics like object-oriented programming, algorithms and data structures. You don’t need to cover everything that’s done in a college algorithms class, but there are certain topics everyone programming should know. Some algorithms tutorials are available on TopCoder, and if you want a fuller treatment, Coursera and Udacity seem to have decent courses on the topic. Its also important to (eventually) learn good programming practice, such as using version control, debugging techniques, and writing test code (Udacity). Once you’ve learned these topics, you’ll have the experience to help beginner programmers!

Learning How to Program – Picking a Langauge

Lately, learning how to program has become quite popular, so I figured I would put together a quick guide to help people get started. As I discuss in The Future of Education II, I think many people should learn some programming. Even if they don’t want to do it full-time, they’ll still be able to use it for various smaller things in life. In part I of this guide, I’ll discuss the different popular languages that one can learn.

The first step is to pick a language. You shouldn’t worry to much about this choice, since you can learn the basic programming fundamentals no matter what programming language you choose. However, you might as well pick the language that fits best with your goals. Since the web is the main area of action nowadays, I’ll quickly review how websites work before going through different languages.

The webpages you view have been sent over by a server. Sometimes, its just a static page that was just sitting there on the server, but on modern sites, the page is often dynamically created for you. That means some code was being run on the server (the “back-end”) to generate the page that it sent over to you. Websites can use any language on their back-end that is supported by their web host. The page that gets displayed is formatted in static HTML (a markup language), but it can contain Javascript that runs in the browser which allow it to do many more things.

Javascript
Since Javascript runs in all browsers, it can be a good choice of language to learn. No installation is required, since it can immediately be tried out in the browser. Javascript can be used for visual effects, but also for doing things without having to update the entire webpage. Modern web apps require Javascript for many of their features. (For example, try loading Gmail without javascript.) Javascript is also used in many web-related areas, such as creating browser extensions. It is often used for other areas that beginners might be interested in, such as creating AppScripts to work with Google Apps, or On(X) to automate things on Android. If you are interested in any of these purposes, javascript may be a good language to learn. However, Javascript has certain confusing parts, so if you’re not planning on using it for one of the above purposes, you can try a more elegant language  such as Python.

PHP
PHP is a language built for creating dynamic web pages, and it runs on the server-side. Let’s say you just finished building websites without coding and now you want to be able to customize things further. You want to learn how to program the brains of the website, i.e. the back-end. A large number of websites and scripts are built using PHP, and web hosts often come with a list of one-click-install scripts. If you want to create a plugin for WordPress or work with the same script that runs Wikipedia, then PHP is for you. Practically all dynamic web hosts run PHP, and its very easy to get started with it. However, PHP has some issues, such as a messy syntax and certain inconsistencies and quirks. This means it might be better to learn a different language if just want to learn programming or you want to create an entirely new web app. However, PHP has improved over time, and if it fits your purposes, go ahead and learn it.

Python
If you just want an easy and elegant language to learn programming, Python is a good choice. Unlike PHP and Javascript, which are made for the web, Python is a general-purpose language that can be used outside of websites. Python tries to be a very readable language, so even a beginner should be able to figure out what a sample of Python code accomplish.  Python has the unusual feature of using indentation to mark different parts of code. This makes the code look less cluttered, but can sometimes cause issues when copying code. If you don’t have a specific goal that fits with one of the other languages  Python is a good choice to go with.

Ruby
Ruby is similar to Python in many ways. It is a general-purpose language which is focused more on programmer productivity than running-time on a machine. This ‘slowness’ isn’t really an issue for most cases a beginner will deal with. Ruby has become very popular recently due to the website-building framework written in it – Ruby on Rails. Rails developed certain principles (such as “convention over configuration”) that let programmers built websites quickly. If you are interested in creating websites with Rails, then it obviously makes sense to learn some Ruby. While Rails can be used without that much Ruby knowledge, I think a beginner should first learn a simple language before taking on a complex framework.

Java
Java is different than the other languages listed here in a number of ways. All code created in Java needs to be “compiled” into another code before it runs, and all variables need to be “declared” with their name and type. Java also enforces a methodology known as “object-oriented programming”, requiring all code to belong to an “object”. While there are various benefits to these decisions, they can make it take slightly longer to play around with code and test things out. Java is a heavy-duty language that runs quickly on machines, and it is taught in schools and used in many big companies. People who program in Java use an IDE for programming, which can provide various features to help with programming, such as auto-completion suggestions while they code, and automatic highlighting of certain errors. Java is also the language that Android and Android apps are written in, so if you want to code such apps, you need to learn Java. Java’s rules will help you detect certain errors before even running the code, so it does have certain benefits as a first language. However, Java is not the language to pick if if you are interested in quickly creating dynamic websites, or in writing quick scripts for various purposes.

Summary: 

Pick:__      if you want to:__
Javascript – Program front-end webpages, extensions, Appscripts, etc.
PHP – Work with existing PHP scripts
Python – Use a easy general-purpose language
Ruby – Create sites with Ruby on Rails
Java – Program Android apps, Strict rules prevent errors