# Programmieren

## Workflow

* "Make the change easy, than make the easy change"
* Testsuit durchlaufen lassen
* Test schreiben
  * mit Kommentaren dokumentieren, was passieren soll
* Programmieren und testen, bis Ergebnis erreicht
* Testsuit durchlaufen lassen
* Committen
* Refactoring
* Testsuit durchlaufen lassen
* Committen
* Dokumentieren
  * Warum?
  * Was passiert?
  * Funktionsweise der Änderung
* Code immer besser hinterlassen, als ich ihn vorgefunden habe

### Links

* [Writing a program: 1. Analyze the problem. 2. Build the flow chart. 3. Code the instructions.](https://twitter.com/kevinbaker/status/1450684742916005892)

## Verbessern

1. Every morning, take your favorite open source library or one from a language you’re learning, go to the closed PRs on Github and start reading them from the beginning. Just a few a morning for warmup while you drink your morning coffee and catch up on email.
2. When you want to level up, start reading the diff, and review the code and changes yourself before reading the comments.
3. Finally, when you start feeling more confident, start leaving those comments on new PRs so that the maintainer doesn’t have to. You’re starting to contribute to open source!

[How To Rapidly Improve At Any Programming Language](https://www.cbui.dev/how-to-rapidly-improve-at-any-programming-language/)

## Lesbarer Code

* Lesbaren Code priorisieren
* den "ersten Entwurf" überarbeiten
* Starten, indem ich mir mit Kommentaren selbst erkläre, was passieren soll
* Mehrere kleine Funktionen, die erklären, was passiert
* Lieber mehr Funktionen als konfigurierbare Funktionen
* Code schreiben, der für Menschen einfach zu verstehen ist, anstatt für Computer gut zu lesen

### Links

* [How to write readable code](http://jeremymikkola.com/posts/2021_02_02_how_to_write_readable_code.html)

## Tests

* [You should want to write unit tests and here is why](https://dev.to/jbszczepaniak/you-should-want-to-write-tests-and-here-is-why-4bi5)

## Dokumentation

Bevor ich programmiere, möchte ich mir genau aufschreiben, was ich vorhabe, welche Alternativen ich habe und wie ich es umsetzen möchte. Dadurch denke ich intensiv über das Thema nach und das Progammieren sollte deutlich einfacher werden und ich habe eine Dokumentation und kann genau nachvollziehen, wo ich stehe und warum ich Dinge so umgesetzt habe. Das erleichtert mir die Wartung.

### Links

* [Documentation Guide](https://www.writethedocs.org/guide/index.html)
* [Write self-deprecating comments](https://thepugautomatic.com/2021/02/write-self-deprecating-comments/)
* [Why programmers don’t write documentation](https://kislayverma.com/programming/why-programmers-dont-write-documentation/)

## Naming

* [Naming cheatsheet](https://github.com/kettanaito/naming-cheatsheet)
* [Why Is Naming Things Hard?](https://neilkakkar.com/why-is-naming-things-hard.html)
* [API Design Guidelines](https://www.swift.org/documentation/api-design-guidelines/#fundamentals)

## Setup

* [Setup Livestreaming](https://mattstauffer.com/blog/setting-up-your-webcam-lights-and-audio-for-remote-work-podcasting-videos-and-streaming/)

## Tools

* [Dash](https://kapeli.com/dash)
* [Metadoc](https://beta.metadoc.io/)
* [My Favorite Tools](https://gedd.ski/post/favorite-tools/)

## Snippets

* [GitHub Gists](https://github.com/nikitavoloboev/knowledge/blob/aaaef58e798f17cb4535d594c29318908d3dbd43/sharing/my-gists.md)

## Courses

* [Laracasts](https://laracasts.com/)
* [The Mailcoach video course](https://mailcoach.app/videos)
* [Eloquent Performance Patterns](https://eloquent-course.reinink.ca/)
* [Laravel Package Training](https://laravelpackage.training/)
* [Want to learn DevOps?](https://www.freecodecamp.org/news/devops-prerequisites-course/)
* [Architecture Playbook](https://nocomplexity.com/documents/arplaybook/index.html)
* [Electronic References](https://csgordon.github.io/books.html)

## Ablauf

* Plan ausarbeiten
* Klassen / Funktionen erstellen
* Kommentare mit Umsetzung in Klasse / Funktion schreiben
* Kommentare in umsetzen

## Object-Orientated Programming (OOP)

> "turn nouns from the problem domain into objects and verbs into methods" - [A hopefully modern description of Object-Oriented Design](https://www.sicpers.info/2021/05/a-hopefully-modern-description-of-object-oriented-design/)

## Debug

* [What is Debugging?](https://www.freecodecamp.org/news/what-is-debugging-how-to-debug-code/)

## Zitate

> "If you want to be a good coder, try to get the fundamentals correct. Solve a lot of problems. Write a lot of code in any freaking language. Try to analyze a problem and see what are the different sub-problems that you need to solve." - [What one tip changed your coding skills forever?](https://qr.ae/pGnJLd)

## Links

* [Online communities](https://twitter.com/jsjoeio/status/1276911919845310465)
* [How to Beat Coder's Block](https://www.freecodecamp.org/news/how-to-beat-coders-block-and-stay-productive/)
* [How to Design Perfect (Software) Products](http://hintjens.com/blog:19)
* [Devhints](https://devhints.io/) - TL;DR for documentation.
* [Software Architect](https://github.com/justinamiller/SoftwareArchitect)
* [Things I believe](https://gist.github.com/stettix/5bb2d99e50fdbbd15dd9622837d14e2b)
* [One Hundred Ideas for Computing](https://samsquire.github.io/ideas/)
* [H+H Principles](https://github.com/hplush/hplu.sh/blob/master/principles.md)
* [Tania Rascia ](https://www.taniarascia.com/blog/)- Anleitungen zu verschiedenen Themen
* [Write the comments first, then fill in the code.](https://www.reddit.com/r/AskComputerScience/comments/gx7b8r/what_one_tip_changed_your_coding_skills_forever/)
* [Where to post your project](https://www.notion.so/Where-to-post-your-project-bc6ce54240884770b2467c3b0f7c1624)
* [SOLID Principles In PHP](https://www.hashbangcode.com/article/solid-principles-php)
* [How to Review Code as a Junior Developer](https://medium.com/pinterest-engineering/how-to-review-code-as-a-junior-developer-10ffb7846958)
* [Organizing Miscellaneous Utility Functions](https://afilina.com/misc-util-functions)
* [Opinion-driven design](https://stitcher.io/blog/opinion-driven-design)
* [The road to hell is paved with special features for special customers](https://twitter.com/mostalive/status/1415983044935274506)
* [What has improved You as a Developer?](https://news.ycombinator.com/item?id=28085189)
* [How I Write Code: Pen & Paper](https://noteflakes.com/articles/2021-09-02-how-i-write-code-pen-paper)
* [How to be a great programmer](https://www.youtube.com/watch?v=XklQac5WLs4) - Curiosity, Breaking down problems, write down what you want to accomplish
* [Code Catalog](https://codecatalog.org/) - Code Catalog is a collection of instructive code examples with annotations
* [Programming Guidelines](https://github.com/guettli/programming-guidelines)
* [20 Things I’ve Learned in my 20 Years as a Software Engineer](https://www.simplethread.com/20-things-ive-learned-in-my-20-years-as-a-software-engineer/)
* [The Good Research Code Handbook](https://goodresearch.dev/)
* [Software Paper Cuts](https://matthewbischoff.com/software-paper-cuts/)
* [Rubber Duck Debugging](https://www.freecodecamp.org/news/rubber-duck-debugging/)
* [Professional Programming: The First 10 Years](https://thorstenball.com/blog/2022/05/17/professional-programming-the-first-10-years/)
* [We invested 10% to pay back tech debt; Here's what happened](https://blog.alexewerlof.com/p/tech-debt-day)
* [How to Design Programs](https://htdp.org/2023-3-6/Book/index.html)
* [Quasar](https://quasar.dev/) - The enterprise-ready cross-platform VueJs framework
