# Some random recommendations

After our twenty days of python together you should have a solid understanding of the world of programming.
The foundation of all essential concepts should be clear enough to understand code when it is in front of you.
A blank slate could still pose a challenge but for that, here are some links and recommendations.

## IDE

Maybe try out some other IDE to see if you like the workflow or layout better.
I'm a big fan of [vim](https://en.wikipedia.org/wiki/Vim_(text_editor)), especially with some good [plugins](https://gitea.86thumbs.net/waldek/linux_course_doc/src/branch/master/modules/qualifying/learning_vim_configuration.md).
It's not an *easy* editor to learn but the payoff is pretty great.
For the more *normal* people I would recommend having a look at the following editors, in no particular order.

* [atom](https://atom.io/)
* [vscode](https://code.visualstudio.com/)
* [brackets](https://brackets.io/)
* [spyder](https://www.spyder-ide.org/) for a more scientific approach

Don't hop around too much though.
If you're a bit bored with pycharm it could be refreshing to *see* your code through a different window.

## Syntax

Start paying attention to the style guides that pop up in your IDE and follow up on them by reading the actual rules.
It can be good way to discover some do's and don't and help you to make your code more readable.
I would also recommend you start browsing online for some coding projects in a field of your interests.
The bigger the project, the higher the chance it follows a specific style.
By reading and trying to understand their code, you'll start to build a better feel how to annotate, structure and make your code more readable.
As this is a *very* subjective topic I can only point you to projects I like.

* [python-language-server](https://github.com/palantir/python-language-server)
* [python-osc](https://github.com/attwad/python-osc)
* [urwid](https://urwid.org/index.html)
* [natural language toolkit](https://www.nltk.org/)

## Concepts

We touched on *most* of the elementary concepts but we did go over them quite quickly.
Take your time to review all base concepts with small exercises and try to chain them together into bigger projects.
Some python specific *new* concepts I would highly advise you to look into are the following.

* [decorators](https://realpython.com/primer-on-python-decorators/)
* [getters and setters](https://stackoverflow.com/questions/2627002/whats-the-pythonic-way-to-use-getters-and-setters)
* [concurrency](https://realpython.com/python-concurrency/)
* [threading vs async vs multiprocessing](https://leimao.github.io/blog/Python-Concurrency-High-Level/)
* [design patterns](https://python-patterns.guide/)
* [memory management in python](https://realpython.com/python-memory-management/)
* [virtual environments](https://docs.python.org/3/tutorial/venv.html)

If you're interested in creating web applications I would start out with [bottle](https://bottlepy.org/docs/dev/), work your way up to [flask](https://www.fullstackpython.com/flask.html) and maybe move over to [django](https://www.djangoproject.com/).
You'll definitely need to learn [SQL](https://en.wikipedia.org/wiki/SQL) at some point but you can make your life easier by using [sqlalchemy](https://www.sqlalchemy.org/).

If you want to dive deep into data science you'll need get comfortable with [numpy](https://numpy.org/), [pandas](https://pandas.pydata.org/) and [matplotlib](https://matplotlib.org/).
The easiest way to get comfortable with all of those is probably [jupyter notebook](https://jupyter-notebook.readthedocs.io/en/stable/index.html) which is an IDE that you use in your browser.
It's quite different from the pycharm you're used to but it's a very good tool to do data analysis.

If robotics is your thing you might want to give [micropython](https://micropython.org/) a go.
I've never used it myself but I've heard good things about it.

## Books

These are some books I've actually read and enjoyed.

* [mastering python design patterns](https://www.amazon.de/-/en/Kamon-Ayeva/dp/1788837487/ref=sr_1_2?keywords=python+design+muster&qid=1651784267&sprefix=python+des%2Caps%2C82&sr=8-2)
* [fluent python](https://www.amazon.de/-/en/Luciano-Ramalho-dp-1492056359/dp/1492056359/ref=dp_ob_title_bk)
* [design patterns](https://www.amazon.de/-/en/Erich-Gamma/dp/9332555400/ref=sr_1_9?keywords=gang+of+four+design+muster&qid=1651784413&sprefix=gang+of+%2Caps%2C68&sr=8-9)
* [learn python the hard way](https://learnpythonthehardway.org/python3/)
* [automate the boring stuff](https://automatetheboringstuff.com/)

# Linux

If you enjoyed the experience of the computers at the school you should give [linux](https://en.wikipedia.org/wiki/Linux) a go at home!
You used a [debian](https://www.debian.org/) machine with [GNOME](https://www.gnome.org/) as a graphical interface.
If you're really motivated you could read through my [introduction to linux](https://gitea.86thumbs.net/waldek/linux_short) course.
It's a work in progress and all feedback is welcome.
