Answers.Body: <p>You certainly don't need a list longer than this one. If you do even half of this you will have learned enough to know pretty much what should be next. Having a complete list now gives you very little. </p>
  
  <p>What you really need is <em>practice</em> and <em>feedback</em>. For practice, find some significant problem and build a program to solve it. Use the best methodology you know about (including testing) and if it works, fine, otherwise look at some other methodologies. You can often find problems in books or online, but knowing that something is significant is harder for a self learner. </p>
  
  <p>But the biggest impediment for the self learner is getting adequate feedback. Just because something works isn't evidence that it is actually good or well structured. For feedback you need someone with more python knowledge than you have and who can comment on your code and even on your approach. That is one of the big advantages of taking regular courses. A teacher/professor can provide problems that are <em>just hard enough</em> to stretch your skills, but also give you the feedback on what you are doing and point to the next steps. </p>
  
  <p>But reading about all those things won't make a programmer out of you, nor will building a "complete" list. </p>
  
  <p>Write programs. Get feedback. There is no shortcut. </p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2018-12-10T22:14:30.343Z
Answers.Text: For feedback, with working code that might be improved for performance, clarity, etc., there is [codereview.se] where feedback might be available.
Answers.UserDisplayName: Gypsy Spellweaver
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2018-12-18T11:55:43.060Z
Answers.Text: I agree this list is far to long. This is too much planning. When I park my car, I never know where it is. However I always know which way to turn at each junction. I take the shortest (or nearly), path. I don't need to plan the whole path. Same is true of programming, or learning. When you learn new things, the plan will have to change, so don't over plan it.
Answers.UserDisplayName: ctrl-alt-delor
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2018-12-10T21:36:35.987Z
Answers.LastActivityDate: 2018-12-10T21:36:35.987Z
Answers.UserDisplayName: Buffy
Answers.Body: <p>Your list of items is very complete and would fill a good part of a Bachelor's degree curriculum. One thing to not overlook is that some of the aspects you highlight make little sense in the context of Python.</p>
  
  <p>For instance, interfaces (as in Java Interfaces) express the behavior of classes that implements them, and can simulate multiple-inheritance. In Python, you have some kind of abstract classes and multiple-inheritance, which allows you to have the same results, but work really differently.</p>
  
  <p>Likewise, the notion of type polymorphism (as in parametric polymorphism or Java/C# generics) is precisely that a function/method <em>cannot</em> inspect a parametric argument. In Python, function arguments are not typed so all this is moot. You can pass any argument to any function and it may or may not fail depending on what the function does.</p>
  
  <p>This is not a critic of Python, but rather a remark that for some concepts, most of the teaching material that you will find will use another language (where the concepts makes more sense). Trying to shoehorn them in Python may result in non-idiomatic code that is both hard to read and does not fully illustrate the concept you study and its benefits.</p>
  
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2018-12-11T13:57:35.897Z
Answers.Text: Actually, objects in python have types. Variables don't. It is an important distinction. The type of an object is set at creation and never changes. A variable can refer to any object independent of the type of the object.
Answers.UserDisplayName: Buffy
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2018-12-11T14:08:57.010Z
Answers.Text: @Buffy point taken. That was a shortcut to say that since function parameters are not typed, python is not the ideal language to study parametric polymorphism.
Answers.UserDisplayName: Kim Nguyễn
Answers.ContentLicense: CC BY-SA 4.0
Answers.CreationDate: 2018-12-11T13:13:23.257Z
Answers.LastActivityDate: 2018-12-11T14:06:40.493Z
Answers.LastEditDate: 2018-12-11T14:06:40.493Z
Answers.UserDisplayName: Kim Nguyễn
Body: <p>At first I will say, I known some basics Python and Haskell. For now I decided to follow my programming road with Python. I have chosen a few issues and their learning path, hence I would like to know if they will be a good way to get to know Python programming language better, with the implementation of algorithms including languages, with the implementation and knowledge of data structures and modules and frameworks. </p>
  
  <p>Also I would like to ask what should I add to my list or delete? Of course, the issues will be mixed up so that you do not learn only data structures all day long and maybe it is a good idea? Additionally, I would like to know if additional projects or exercises are needed in all situations? I know that some issues are very easy and after reading I am able to notice the problems, advantages, disadvantages or exemplary implementation that arise.</p>
  
  <p>If I have mistaken the forum, I am sorry and I am asking for appropriate redirection.</p>
  
  <p>So the list looks like:</p>
  
  <p><strong>Programming and some other derivatives</strong></p>
  
  <ul>
  <li>Object-oriented
  
  <ul>
  <li>Classes</li>
  <li>Objects</li>
  <li>Interfaces</li>
  <li>Abstraction</li>
  <li>Encapsulation</li>
  <li>Polymorphism</li>
  <li>Inheritance
  
  <ul>
  <li>Duck Typing</li>
  </ul></li>
  <li>SOLID rules
  
  <ul>
  <li>one responsibility</li>
  <li>open + closed</li>
  <li>substitutions Liskov</li>
  <li>segregation of interfaces</li>
  <li>reversing dependencies</li>
  </ul></li>
  <li>Tests
  
  <ul>
  <li>Unitary</li>
  <li>Functional</li>
  <li>Integration</li>
  </ul></li>
  </ul></li>
  <li>Monkey Patching</li>
  <li>REST
  
  <ul>
  <li>HATEOAS</li>
  </ul></li>
  <li>PEP8</li>
  <li>MOCKS</li>
  <li>VirtualENV</li>
  <li>Asynchrony</li>
  <li>Python Idioms
  
  <ul>
  <li>Decorators</li>
  <li>Gneratory</li>
  <li>Mapping</li>
  <li>Meta class</li>
  </ul></li>
  <li>Any other things from Python
  
  <ul>
  <li>Mutable and immutable objects</li>
  <li><code>__init__</code></li>
  <li><code>__str__</code></li>
  <li>iteration</li>
  <li>self</li>
  </ul></li>
  <li>MVC
  
  <ul>
  <li>MVT</li>
  </ul></li>
  </ul>
  
  <p><strong>Frameworks</strong></p>
  
  <ul>
  <li>flask</li>
  <li>pandas</li>
  <li>tornado</li>
  <li>django (basics)
  
  <ul>
  <li>Patterns</li>
  <li>ORM</li>
  </ul></li>
  </ul>
  
  <p><strong>Modules</strong></p>
  
  <ul>
  <li>NumPy</li>
  </ul>
  
  <p><strong>Database</strong></p>
  
  <ul>
  <li>NoSQL
  
  <ul>
  <li>MongoDB</li>
  </ul></li>
  <li>SQL
  
  <ul>
  <li>MySQL</li>
  </ul></li>
  </ul>
  
  <p><strong>Additional items</strong></p>
  
  <ul>
  <li>Git</li>
  <li>Docker</li>
  </ul>
  
  <p><strong>Project patterns</strong></p>
  
  <ul>
  <li>Observer</li>
  <li>Builder</li>
  <li>Facade</li>
  <li>Factory</li>
  <li>Singleton antisense</li>
  </ul>
  
  <p><strong>Data structures</strong></p>
  
  <ul>
  <li>Basics
  
  <ul>
  <li>Stack</li>
  <li>Queue</li>
  <li>List
  
  <ul>
  <li>One directional</li>
  <li>Two-directional</li>
  <li>With the sentry</li>
  </ul></li>
  <li>Trees
  
  <ul>
  <li>Binary</li>
  <li>Binary searches</li>
  <li>BSP</li>
  <li>AVL</li>
  <li>T</li>
  <li>B</li>
  </ul></li>
  <li>Graphs</li>
  </ul></li>
  </ul>
  
  <p><strong>Algorithms</strong></p>
  
  <ul>
  <li>Operating principles
  
  <ul>
  <li>divide and conquer</li>
  <li>greedily</li>
  <li>dynamic</li>
  <li>linear</li>
  </ul></li>
  <li>Techniques
  
  <ul>
  <li>procedural</li>
  <li>recursive</li>
  <li>object-oriented</li>
  </ul></li>
  <li>Sorting
  
  <ul>
  <li>Bubble</li>
  <li>Insertion</li>
  <li>Quick</li>
  <li>Merge</li>
  </ul></li>
  <li>Search
  
  <ul>
  <li>Linear</li>
  <li>Binary</li>
  </ul></li>
  <li>Graphs
  
  <ul>
  <li>Dijkstra</li>
  <li>DFS</li>
  <li>BFS</li>
  <li>Kruskal</li>
  <li>Prim</li>
  </ul></li>
  <li>Data mining
  
  <ul>
  <li>C4.5</li>
  <li>k-means</li>
  </ul></li>
  </ul>
  
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2018-12-18T08:52:31.223Z
Comments.Text: I recommend learning modelling with UML (class diagrams and more, but especially class diagrams).
Comments.UserDisplayName: deHaar
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2018-12-18T11:58:39.873Z
Comments.Text: I good way to learn object orientation is to learn Eiffel (language), first. It may seem like a diversion, but it will be quicker. You will learn OO properly, then you can learn how to apply it to any language. (and singleton is an anti-pattern, I have seen no valid use for it, except to wrap unprotected mono-static code. mono-static code is also an anti-pattern.).
Comments.UserDisplayName: ctrl-alt-delor
Comments.ContentLicense: CC BY-SA 4.0
Comments.CreationDate: 2019-02-18T18:41:37.880Z
Comments.Text: That is *years* worth of material. I also seriously doubt that you'll use more than a fraction of it in your professional career (which fraction will depend on the career).
Comments.UserDisplayName: Jared Smith
Tags: <self-learning><python><programming>
Title: What is the best way to learn an object oriented programming language with framework, data structure and alogrithms?
ThreadText: # What is the best way to learn an object oriented programming language with framework, data structure and alogrithms?
  
  (Asked by: username_0 on 2018-12-10)
  
  At first I will say, I known some basics Python and Haskell. For now I decided to follow my programming road with Python. I have chosen a few issues and their learning path, hence I would like to know if they will be a good way to get to know Python programming language better, with the implementation of algorithms including languages, with the implementation and knowledge of data structures and modules and frameworks.
  
  Also I would like to ask what should I add to my list or delete? Of course, the issues will be mixed up so that you do not learn only data structures all day long and maybe it is a good idea? Additionally, I would like to know if additional projects or exercises are needed in all situations? I know that some issues are very easy and after reading I am able to notice the problems, advantages, disadvantages or exemplary implementation that arise.
  
  If I have mistaken the forum, I am sorry and I am asking for appropriate redirection.
  
  So the list looks like:
  
  **Programming and some other derivatives**
  
  * Object-oriented
    + Classes
    + Objects
    + Interfaces
    + Abstraction
    + Encapsulation
    + Polymorphism
    + Inheritance
      - Duck Typing
    + SOLID rules
      - one responsibility
      - open + closed
      - substitutions Liskov
      - segregation of interfaces
      - reversing dependencies
    + Tests
      - Unitary
      - Functional
      - Integration
  * Monkey Patching
  * REST
    + HATEOAS
  * PEP8
  * MOCKS
  * VirtualENV
  * Asynchrony
  * Python Idioms
    + Decorators
    + Gneratory
    + Mapping
    + Meta class
  * Any other things from Python
    + Mutable and immutable objects
    + `__init__`
    + `__str__`
    + iteration
    + self
  * MVC
    + MVT
  
  **Frameworks**
  
  * flask
  * pandas
  * tornado
  * django (basics)
    + Patterns
    + ORM
  
  **Modules**
  
  * NumPy
  
  **Database**
  
  * NoSQL
    + MongoDB
  * SQL
    + MySQL
  
  **Additional items**
  
  * Git
  * Docker
  
  **Project patterns**
  
  * Observer
  * Builder
  * Facade
  * Factory
  * Singleton antisense
  
  **Data structures**
  
  * Basics
    + Stack
    + Queue
    + List
      - One directional
      - Two-directional
      - With the sentry
    + Trees
      - Binary
      - Binary searches
      - BSP
      - AVL
      - T
      - B
    + Graphs
  
  **Algorithms**
  
  * Operating principles
    + divide and conquer
    + greedily
    + dynamic
    + linear
  * Techniques
    + procedural
    + recursive
    + object-oriented
  * Sorting
    + Bubble
    + Insertion
    + Quick
    + Merge
  * Search
    + Linear
    + Binary
  * Graphs
    + Dijkstra
    + DFS
    + BFS
    + Kruskal
    + Prim
  * Data mining
    + C4.5
    + k-means
  
  **Tags:** self-learning, python, programming
  
  > **Comments:**
  > **username_1**: I recommend learning modelling with UML (class diagrams and more, but especially class diagrams).  
  > **username_2**: I good way to learn object orientation is to learn Eiffel (language), first. It may seem like a diversion, but it will be quicker. You will learn OO properly, then you can learn how to apply it to any language. (and singleton is an anti-pattern, I have seen no valid use for it, except to wrap unprotected mono-static code. mono-static code is also an anti-pattern.).  
  > **username_3**: That is *years* worth of material. I also seriously doubt that you'll use more than a fraction of it in your professional career (which fraction will depend on the career).  
  
  ---
  
  ## 2 answers
  
  ### Answer by username_4 on 2018-12-10. Score: 7
  
  You certainly don't need a list longer than this one. If you do even half of this you will have learned enough to know pretty much what should be next. Having a complete list now gives you very little.
  
  What you really need is *practice* and *feedback*. For practice, find some significant problem and build a program to solve it. Use the best methodology you know about (including testing) and if it works, fine, otherwise look at some other methodologies. You can often find problems in books or online, but knowing that something is significant is harder for a self learner.
  
  But the biggest impediment for the self learner is getting adequate feedback. Just because something works isn't evidence that it is actually good or well structured. For feedback you need someone with more python knowledge than you have and who can comment on your code and even on your approach. That is one of the big advantages of taking regular courses. A teacher/professor can provide problems that are *just hard enough* to stretch your skills, but also give you the feedback on what you are doing and point to the next steps.
  
  But reading about all those things won't make a programmer out of you, nor will building a "complete" list.
  
  Write programs. Get feedback. There is no shortcut.
  
  > **Comments:**
  > **username_5**: For feedback, with working code that might be improved for performance, clarity, etc., there is [codereview.se] where feedback might be available.  
  > **username_2**: I agree this list is far to long. This is too much planning. When I park my car, I never know where it is. However I always know which way to turn at each junction. I take the shortest (or nearly), path. I don't need to plan the whole path. Same is true of programming, or learning. When you learn new things, the plan will have to change, so don't over plan it.  
  
  ---
  
  ### Answer by username_6 on 2018-12-11. Score: 5
  
  Your list of items is very complete and would fill a good part of a Bachelor's degree curriculum. One thing to not overlook is that some of the aspects you highlight make little sense in the context of Python.
  
  For instance, interfaces (as in Java Interfaces) express the behavior of classes that implements them, and can simulate multiple-inheritance. In Python, you have some kind of abstract classes and multiple-inheritance, which allows you to have the same results, but work really differently.
  
  Likewise, the notion of type polymorphism (as in parametric polymorphism or Java/C# generics) is precisely that a function/method *cannot* inspect a parametric argument. In Python, function arguments are not typed so all this is moot. You can pass any argument to any function and it may or may not fail depending on what the function does.
  
  This is not a critic of Python, but rather a remark that for some concepts, most of the teaching material that you will find will use another language (where the concepts makes more sense). Trying to shoehorn them in Python may result in non-idiomatic code that is both hard to read and does not fully illustrate the concept you study and its benefits.
  
  > **Comments:**
  > **username_4**: Actually, objects in python have types. Variables don't. It is an important distinction. The type of an object is set at creation and never changes. A variable can refer to any object independent of the type of the object.  
  > **username_6**: @username_4 point taken. That was a shortcut to say that since function parameters are not typed, python is not the ideal language to study parametric polymorphism.  
  
  ---
  
  