title: Learning Programming
category: page
slug: learning-programming
sortorder: 0101
toc: False
sidebartitle: Learning Programming
meta: Want to learn how to code but don't know where to start? Read up on approaches to learning programming on Full Stack Python.


Learning to program is about understanding how to translate thoughts into 
source code that can be executed on computers to achieve one or more goals.

There are many steps in learning how to program, including

1. setting up a [development environment](/development-environments.html)
1. selecting a [programming language](/python-programming-language.html), 
   of which 
   [Python is just one of many amazing ecosystems](/why-use-python.html)
   that you can decide to use
1. understanding the syntax and commands for the language
1. writing code in the language, often using 
   [pre-existing code libraries](/application-dependencies.html) and 
   [frameworks](/web-frameworks.html)
1. executing the program
1. [debugging errors](/debugging.html) and 
   [testing for unexpected results](/testing.html)
1. [deploying](/deployment.html) an application so it can run for intended 
   users


### How should I learn programming?
There are several schools of thought on how a person should start learning
to program. One school of thought is that a lower-level programming
language such as Assembly or C are the most appropriate languages to start
with because they force new developers to write their own data structures, 
learn about pointers and generally work their way through the hard problems 
in computer science.

There's certainly wisdom in this "low-level first" philosophy because it 
forces a beginner to gain a strong foundation before moving on to higher
level topics such as web and mobile application development. This philosophy 
is the one most commonly used in university computer science programs.

The atomic units of progress in the "low-level first" method of learning are 

1. aspects of programming language understood (type systems, syntax)
1. number of data structures coded and able to be used (stacks, queues)
1. algorithms in a developer's toolbelt (quicksort, binary search)

Another school of thought is that new developers should bootstrap
themselves through working on projects in whatever programming language 
interests them enough to keep working through the frustrations that will
undoubtably occur.

In this "project-based" line of thinking, the number of projects completed 
that expand a programmer's abilities are the units of progress. Extra value 
is placed on making the projects open source and working with experienced 
mentors to learn what he or she can improve on in their programs. 

Another way to learn that combines the project-based learning with defined
objectives is to play a computer game that will guide you through the
learning process. For example, [TwilioQuest](https://www.twilio.com/quest/learn/python)
teaches the basics of Python in one of its missions and then has a
ton of free content for studying intermediate and advanced topics.


### Should I learn Python first?
Python is good choice in the project-based approach because of the extensive 
availability of 
[free and low cost introductory resources](/best-python-resources.html),
many of which provide example projects to build upon.

Note that this question of whether or not Python is a good first language
for an aspiring programmer is highly subjective and these approaches are
not mutually exclusive. Python is also widely taught in universities to 
explain the fundamental concepts in computer science, which is in line 
with the "low-level first" philosophy than the projects-first method.

In a nutshell, whether Python is the right first programming language to 
learn is up to your own learning style and what feels right. If Ruby or Java
seem like they are easier to learn than Python, go for those languages.
Programming languages, and the ecosystems around them, are human-made 
constructs. Find one that appears to match your personal style and give it a
try, knowing that whatever you choose you'll need to put in many long days and
nights to really get comfortable as a software developer.


### Practice problems
Working on practice programming challenges and studying their solutions in
Python or another language is a great way to learn whether you are just
starting or an experienced developer. Here are numerous open source 
repositories and sites with practice problems and solutions:

* [Pytudes](https://github.com/norvig/pytudes) are an awesome collection
  of Python programs to practice and demonstrate skills. These problems
  go above and beyond the common data structures and algorithm questions 
  often found in other practice problem sets.

* [Interactive Python coding interview challenges](https://github.com/donnemartin/interactive-coding-challenges)
  is an awesome [Jupyter Notebook](/jupyter-notebook.html) to learn and
  test your data structures and algorithms knowledge in Python.

* [Kindling project](https://nedbatchelder.com/text/kindling.html)
  provides a wonderful list of resources that challenge beginners with
  programming problems that beginners can solve to grow their skills.

* [Build your own "x"](https://github.com/danistefanovic/build-your-own-x)
  does not contain practice problems but instead provides tutorials for
  how to build your own programming languages, blockchain, 
  [bots](/bots.html), [databases](/databases.html), 
  [frameworks](/web-frameworks.html) and more awesome projects.

* [Python Programming Exercises](http://joaoventura.net/static/files/python_exercises_book.pdf)
  is a free short PDF book with exercises across many standard Python 
  language features such as dictionaries, classes and functions.

* [Code problems](https://github.com/blakeembrey/code-problems) provides
  common algorithm and data structures challenges with solutions in several
  programming languages including Python.

* [Python basics](https://pythonbasics.org/) contains materials and
  exercises to learn basic Python 3 syntax such as variables, functions
  and lists.

* [TeachCraft](https://teachcraft.net/) combines Minecraft with Python to
  learn coding.


### First-hand advice
These articles are written by programmers who explain how they learned to
code. They should not be taken as "this is how you must learn" but instead
give example paths you can think about taking as a beginner:

* [Learning to program](http://danluu.com/learning-to-program/) 
  is a long read but goes through Dan's experience in math and engineering
  before fully committing to software development.

* [Developing as a developer](https://blog.ragnarson.com/2016/10/07/developing-as-a-developer.html)
  gives general advice on qualities necessary to become a programmer, 
  including persistence, respecting others and considering ideas that are
  outside your comfort zone.

* [This Picture Will Change the Way You Learn to Code](https://dev.to/nextdotxyz/this-picture-will-change-the-way-you-learn-tocode-4kmh)
  covers a well done graphics of many up-to-date concepts and tools that
  developers use. The post reminds you that you will not and should not learn
  everything but that you should pick tools you want to gain experience in
  while generally knowing what else is out there.


### Teaching perspectives
Are you an experienced programmer working with new and junior programmers?
These articles give some insight into how you may want to structure
your teaching experience:

* [Five Principles For Programming Languages For Learners](https://cacm.acm.org/blogs/blog-cacm/203554-five-principles-for-programming-languages-for-learners/fulltext)
  is a perspective on teaching children to program but is good advice 
  for an audience of any age.

* [Teach tech with cartoons](https://jvns.ca/teach-tech-with-cartoons/)
  is an awesome resource that explains how you can use simple but fun
  drawings to teach otherwise difficult technical concepts to students.

* [Teach Yourself Computer Science](https://teachyourselfcs.com/) is
  intended as a self-teaching tool with many resources that are classic
  computer science textbooks. There are also nice explanations for why
  each resource is useful in your learning and teaching journey.
